Grafalgo
Library of useful data structures and algorithms
|
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 }