Grafalgo
Library of useful data structures and algorithms
/Users/jst/src/grafalgo/cpp/graphAlgorithms/mst/kruskal.cpp
00001 #include "stdinc.h"
00002 #include "Partition.h"
00003 #include "Wgraph.h"
00004 #include "List.h"
00005 
00006 using namespace grafalgo;
00007 
00014 void sortEdges(const Wgraph& wg, edge *elist) {
00015         int i, p, c; edge e; weight w;
00016 
00017         for (i = wg.m()/2; i >= 1; i--) {
00018                 // do pushdown starting at i
00019                 e = elist[i]; w = wg.weight(e); p = i;
00020                 while (1) {
00021                         c = 2*p;
00022                         if (c > wg.m()) break;
00023                         if (c+1 <= wg.m() &&
00024                             wg.weight(elist[c+1]) >= wg.weight(elist[c]))
00025                                 c++;
00026                         if (wg.weight(elist[c]) <= w) break;
00027                         elist[p] = elist[c]; p = c;
00028                 }
00029                 elist[p] = e;
00030         }
00031         // now edges are in heap-order with largest weight edge on top
00032 
00033         for (i = wg.m()-1; i >= 1; i--) {
00034                 e = elist[i+1]; elist[i+1] = elist[1];
00035                 // now largest edges in positions wg.m(), wg.m()-1,..., i+1
00036                 // edges in 1,...,i form a heap with largest weight edge on top
00037                 // pushdown from 1
00038                 w = wg.weight(e); p = 1;
00039                 while (1) {
00040                         c = 2*p;
00041                         if (c > i) break;
00042                         if (c+1 <= i &&
00043                             wg.weight(elist[c+1]) >= wg.weight(elist[c]))
00044                                 c++;
00045                         if (wg.weight(elist[c]) <= w) break;
00046                         elist[p] = elist[c]; p = c;
00047                 }
00048                 elist[p] = e;
00049         }
00050 }
00051 
00057 void kruskal(Wgraph& wg, list<edge>& mstree) {
00058         edge e, e1; vertex u,v,cu,cv;
00059         Partition vsets(wg.n());
00060         edge *elist = new edge[wg.m()+1];
00061         int i = 1;
00062         for (e = wg.first(); e != 0; e = wg.next(e)) elist[i++] = e;
00063         sortEdges(wg,elist);
00064         for (e1 = wg.first(); e1 != 0; e1 = wg.next(e1)) {
00065                 e = elist[e1];
00066                 u = wg.left(e); v = wg.right(e);
00067                 cu = vsets.find(u); cv = vsets.find(v);
00068                 if (cu != cv) {
00069                          vsets.link(cu,cv); mstree.push_back(e);
00070                 }
00071         }
00072 }
 All Classes Files Functions Variables Typedefs Friends