Grafalgo
Library of useful data structures and algorithms
/Users/jst/src/grafalgo/cpp/graphAlgorithms/mst/prim.cpp
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 }
 All Classes Files Functions Variables Typedefs Friends