Grafalgo
Library of useful data structures and algorithms
|
00001 #include "stdinc.h" 00002 #include "Dheap.h" 00003 #include "Wgraph.h" 00004 00005 using namespace grafalgo; 00006 00012 void prim(Wgraph& wg, list<int>& mstree) { 00013 vertex u,v; edge e; 00014 edge *cheap = new edge[wg.n()+1]; 00015 bool *intree = new bool[wg.n()+1]; 00016 Dheap nheap(wg.n(),2+wg.m()/wg.n()); 00017 00018 for (e = wg.firstAt(1); e != 0; e = wg.nextAt(1,e)) { 00019 u = wg.mate(1,e); nheap.insert(u,wg.weight(e)); cheap[u] = e; 00020 } 00021 intree[1] = true; 00022 for (u = 2; u <= wg.n(); u++) intree[u] = false; 00023 while (!nheap.empty()) { 00024 u = nheap.deletemin(); 00025 intree[u] = true; mstree.push_back(cheap[u]); 00026 for (e = wg.firstAt(u); e != 0; e = wg.nextAt(u,e)) { 00027 v = wg.mate(u,e); 00028 if (nheap.member(v) && wg.weight(e) < nheap.key(v)) { 00029 nheap.changekey(v,wg.weight(e)); cheap[v] = e; 00030 } else if (!nheap.member(v) && !intree[v]) { 00031 nheap.insert(v,wg.weight(e)); cheap[v] = e; 00032 } 00033 } 00034 } 00035 delete [] cheap; 00036 }