void Prim2opt::preorderTreeWalk(Grafo<unsigned int> &g, unsigned int v, unsigned int visited[], list<unsigned int> &S) { visited[v] = 1; S.push_back(v); list<unsigned int> adj; g.getAdjacents(v, adj); list<unsigned int>::iterator it = adj.begin(); while(it != adj.end()) { if(!visited[*it]){ preorderTreeWalk(g, *it, visited, S); } it++; } }
Grafo<unsigned int> Prim2opt::getPrim(Grafo<Ciudad> &g, unsigned int vertice) { unsigned int N = g.getSize(); int root[N]; unsigned int distance[N]; unsigned int visited[N]; for (unsigned int i = 0; i < N; i++) { distance[i] = INFINITE; root[i] = -1; visited[i] = 0; } priority_queue <ui_ui, vector<ui_ui>, greater<ui_ui> > pq; distance[vertice] = 0; pq.push(ui_ui(0, vertice)); while (!pq.empty()){ unsigned int aux = pq.top().second; pq.pop(); if (visited[aux] == 1) continue; visited[aux] = 1; list<unsigned int> adj; g.getAdjacents(aux, adj); list<unsigned int>::iterator it = adj.begin(); while (it != adj.end()){ unsigned int dist = g.getData(aux, *it).getCost(); if (dist < distance[*it] && !visited[*it]){ distance[*it] = dist; root[*it] = aux; pq.push(ui_ui(dist,*it)); } it++; } } Grafo<unsigned int> mst = getMinimumSpanningTree(root, distance, N, vertice); return mst; }