Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.69 KB | None | 0 0
  1. template<class T>
  2. vector<Vertex<T> *> Graph<T>::calculateKruskal() {
  3.     unsigned edges_accepted = 0;
  4.     if (vertexSet.size() == 0)
  5.         return this->vertexSet;
  6.  
  7.     vector<Vertex<T>*> res;
  8.     for (unsigned int i = 0; i < this->vertexSet.size(); i++)
  9.     {
  10.         Vertex<T>* v = new Vertex<T>(this->vertexSet[i]->info);
  11.         v->set = i;
  12.         res.push_back(v);
  13.     }
  14.  
  15.     //Initialize the list of edges
  16.     vector<Edge<T> > allEdges;
  17.     for (unsigned int i = 0; i < this->vertexSet.size(); i++)
  18.     {
  19.         Vertex<T>* v = this->vertexSet[i];
  20.         v->set = i;
  21.         for (unsigned int a = 0; a < v->adj.size(); a++)
  22.             allEdges.push_back(v->adj[a]);
  23.     }
  24.  
  25.     //Make heap from vector
  26.     make_heap(allEdges.begin(), allEdges.end(), edge_greater_than<T>());
  27.  
  28.     while (edges_accepted < vertexSet.size()-1)
  29.     {
  30.         sort_heap(allEdges.begin(), allEdges.end());
  31.  
  32.         Edge<T> minEdge = allEdges[0];      // get edge with minimum weight
  33.         allEdges.erase(allEdges.begin());
  34.  
  35.         //Get the vertices
  36.         T o = minEdge.orig->info;
  37.         T d = minEdge.dest->info;
  38.  
  39.         Vertex<T>* origin = NULL;
  40.         Vertex<T>* dest = NULL;
  41.  
  42.         for (unsigned int i = 0; i < res.size(); i++)
  43.         {
  44.             if (o == res[i]->info)
  45.                 origin = res[i];
  46.             if (d == res[i]->info)
  47.                 dest = res[i];
  48.         }
  49.  
  50.         if (origin->set != dest->set)
  51.         {
  52.             int minSet = min(origin->set, dest->set);
  53.             int maxSet = max(origin->set, dest->set);
  54.             for (unsigned int k = 0; k < res.size(); k++) {
  55.                 if (res[k]->set == maxSet)
  56.                     res[k]->set = minSet;
  57.             }
  58.             if (dest->path == NULL)
  59.                 dest->path=origin;
  60.             else if (origin->path == NULL)
  61.                 origin->path=dest;
  62.             edges_accepted++;
  63.             cout << "Adding edge from vertex " << origin->info << " to vertex " << dest->info << endl;
  64.         }
  65.     }
  66.  
  67.     return res;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement