Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- template<class T>
- vector<Vertex<T> *> Graph<T>::calculateKruskal() {
- unsigned edges_accepted = 0;
- if (vertexSet.size() == 0)
- return this->vertexSet;
- vector<Vertex<T>*> res;
- for (unsigned int i = 0; i < this->vertexSet.size(); i++)
- {
- Vertex<T>* v = new Vertex<T>(this->vertexSet[i]->info);
- v->set = i;
- res.push_back(v);
- }
- //Initialize the list of edges
- vector<Edge<T> > allEdges;
- for (unsigned int i = 0; i < this->vertexSet.size(); i++)
- {
- Vertex<T>* v = this->vertexSet[i];
- v->set = i;
- for (unsigned int a = 0; a < v->adj.size(); a++)
- allEdges.push_back(v->adj[a]);
- }
- //Make heap from vector
- make_heap(allEdges.begin(), allEdges.end(), edge_greater_than<T>());
- while (edges_accepted < vertexSet.size()-1)
- {
- sort_heap(allEdges.begin(), allEdges.end());
- Edge<T> minEdge = allEdges[0]; // get edge with minimum weight
- allEdges.erase(allEdges.begin());
- //Get the vertices
- T o = minEdge.orig->info;
- T d = minEdge.dest->info;
- Vertex<T>* origin = NULL;
- Vertex<T>* dest = NULL;
- for (unsigned int i = 0; i < res.size(); i++)
- {
- if (o == res[i]->info)
- origin = res[i];
- if (d == res[i]->info)
- dest = res[i];
- }
- if (origin->set != dest->set)
- {
- int minSet = min(origin->set, dest->set);
- int maxSet = max(origin->set, dest->set);
- for (unsigned int k = 0; k < res.size(); k++) {
- if (res[k]->set == maxSet)
- res[k]->set = minSet;
- }
- if (dest->path == NULL)
- dest->path=origin;
- else if (origin->path == NULL)
- origin->path=dest;
- edges_accepted++;
- cout << "Adding edge from vertex " << origin->info << " to vertex " << dest->info << endl;
- }
- }
- return res;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement