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