本文整理汇总了C++中Grafo::pintar方法的典型用法代码示例。如果您正苦于以下问题:C++ Grafo::pintar方法的具体用法?C++ Grafo::pintar怎么用?C++ Grafo::pintar使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Grafo
的用法示例。
在下文中一共展示了Grafo::pintar方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: pintar_vertices
void pintar_vertices(Grafo& g, std::priority_queue<Vertice, std::vector<Vertice>, std::greater<Vertice> >& vertices) { //std::priority_queue<Vertice> vertices) {
init_time();
int vistos = 0;
int cant_vertices = g.cant_vertices();
// Creo vector para obtener el maximo
for (int i = 0 ; i < cant_vertices ; ++i) {
vertices.push(g.dame_vertice(i));
}
// Recorro todos los vertices del grafo
while (vistos < cant_vertices) {
//std::cout << "vistos: " << vistos << " cant_vertices " << cant_vertices << std::endl;
// Hallar el vertice de mayor grado
Vertice vertice = vertices.top();
// std::cout << "vertice: " << vertice.dame_nombre() << std::endl;
vertices.pop();
std::set<int> colores_vertice = vertice.dame_colores_posibles();
// Creo un diccionario para ver cual es el color
// que mas usan los vecinos
// y otro para ver cual es el que mas se repite entre los
// colores posibles de los vecinos
std::map<int, int> colores_usados;
std::map<int, int> colores_posibles;
for (int color : colores_vertice) {
colores_usados.insert(std::pair<int, int> (color, 0));
colores_posibles.insert(std::pair<int, int> (color, 0));
}
// recorro los vecinos del maximo
std::set<int> vecinos = g.dame_vecinos(vertice.dame_nombre());
for (int v : vecinos) {
int color_vecino = g.dame_color(v);
if (color_vecino != -1) { // Ya esta pintado el vecino y no puedo usar ese color
// Me fijo si el vertice sobre el cual estoy parado tiene a ese
// color como disponible y de ser así lo aumento en el diccionario de colores
std::set<int>::iterator it = colores_vertice.find(color_vecino);
if (it != colores_vertice.end())
colores_usados[color_vecino]++;
} else {
// Si no esta pintado el vecino
std::set<int> colores_vecino = g.dame_colores_posibles(v);
// Por cada color que entre en conflicto sumo 1 en el diccionario
for (int color : colores_vecino) {
std::set<int>::iterator it = colores_vertice.find(color);
if (it != colores_vertice.end()) {
colores_posibles[color]++;
}
}
}
}
// Tengo dos diccionarios que determinan para cada color que tiene el vértice
// la cantidad de vecinos que tienen ese color pintado
// y la cantidad de vecinos que tienen ese color como posibilidad
// Recorro el diccionario de colores usados por mis vecinos
for (int i = 0 ; i < colores_usados.size() ; ++i) {
if (colores_vertice.size() > 1) {
// Elijo el color que es el mas utilizado por mis vecinos
int color_con_mas_apariciones = dame_el_de_maxima_aparicion(colores_usados);
// Lo borro
if (color_con_mas_apariciones != -1 )
colores_vertice.erase(color_con_mas_apariciones);
}
}
// O salgo del for anterior con muchos colores disponibles porque mis vecinos no
// estaban pintados
// o tengo un único color disponible para pintarme
int color;
if (colores_vertice.size() == 1) {
// Si me queda un único color en mi conjunto es el que menos conflictos me causaba
// por ende pinto al grafo de esa manera
std::set<int>::iterator it = colores_vertice.begin();
color = *it;
} else {
// Si me queda más de un color disponible busco en los posibles colores
// de mis vecinos el que quizas me trae menos conflictos
int min = 999;
for (std::pair<const int, int>& par : colores_posibles) {
if (par.second < min) {
std::set<int>::iterator it = colores_vertice.find(par.first);
if (it != colores_vertice.end()) {
min = par.second;
color = par.first;
}
}
}
}
g.pintar(vertice.dame_nombre(), color);
//g.imprimir();
vistos++;
}
acum += get_time();
}