unsigned int Prim2opt::getTourCost(Grafo<Ciudad> &g, list<unsigned int> &L) { unsigned int tourCost = 0; list<unsigned int>::iterator it = L.begin(); list<unsigned int>::iterator itant = it; it++; while ( it != L.end()) { if (*itant != *it) { tourCost += g.getData(*itant, *it).getCost(); itant = it; } it++; } return tourCost; }
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; }