Grafalgo
Library of useful data structures and algorithms
/Users/jst/src/grafalgo/cpp/graphAlgorithms/mst/primF.cpp
00001 #include "stdinc.h"
00002 #include "Wgraph.h"
00003 #include "FheapSet.h"
00004 
00005 using namespace grafalgo;
00006 
00013 void primF(Wgraph& wg, list<edge>& mstree) {
00014         vertex u,v; edge e;
00015         edge* cheap = new edge[wg.n()+1];
00016         FheapSet nheap(wg.n()); fheap root;
00017         bool *inHeap = new bool[wg.n()+1]; // inHeap[u]=true if u is in heap
00018         bool *inTree = new bool[wg.n()+1]; // inTree[u]=true if u is in tree
00019         int numInHeap = 0;
00020 
00021         for (u = 1; u <= wg.n(); u++) inHeap[u] = false;
00022 
00023         e = wg.firstAt(1);
00024         if (e == 0) return;
00025         root = wg.mate(1,e);
00026         do {
00027                 u = wg.mate(1,e); 
00028                 root = nheap.insert(u,root,wg.weight(e)); 
00029                 cheap[u] = e;
00030                 inHeap[u] = true; numInHeap++;
00031                 e = wg.nextAt(1,e);
00032         } while (e != 0);
00033         inTree[1] = true;
00034         for (u = 2; u <= wg.n(); u++) inTree[u] = false;
00035 
00036         while (numInHeap > 0) {
00037                 u = root; root = nheap.deletemin(root);
00038                 inHeap[u] = false; numInHeap--;
00039                 inTree[u] = true; mstree.push_back(cheap[u]);
00040                 for (e = wg.firstAt(u); e != 0; e = wg.nextAt(u,e)) {
00041                         v = wg.mate(u,e);
00042                         if (inHeap[v] && wg.weight(e) < nheap.key(v)) {
00043                                 root = nheap.decreasekey(v,nheap.key(v) -
00044                                                              wg.weight(e),root);
00045                                 cheap[v] = e;
00046                         } else if (!inHeap[v] && !inTree[v]) {
00047                                 root = nheap.insert(v,root,wg.weight(e));
00048                                 cheap[v] = e;
00049                                 inHeap[v] = true; numInHeap++;
00050                         }
00051                 }
00052         }
00053         delete [] cheap; delete [] inHeap;
00054 }
 All Classes Files Functions Variables Typedefs Friends