转自:http://www.cnblogs.com/naix-x/archive/2012/06/13/2548228.html
做最小生成树的时候,用kruskal做稠密图。。怎么都是超时,等等试一下Prim看看能不能过。。期间优化下并查集的部分,看的杭电上的文档,文档上讲的很好,讲了两种方式。
1.把小树合并到大树上去。
2.通过查找时,把树给压缩了。
看文档上讲的比较好。。。
关键代码:
1 int find(int x)//通过查找压缩路径 2 { 3 int i,r,j; 4 r = x; 5 while(r != o[r])//找到根 6 { 7 r = o[r]; 8 } 9 i = x; 10 while (r != i)//把这条路上的节点直接连到根上 11 { 12 j = o[i]; 13 o[i] = r; 14 i = j; 15 } 16 return r; 17 } 18 void merge(int x,int y,int w)//通过把小树合并到大树上 19 { 20 x = find(x); 21 y = find(y); 22 if(x != y) 23 { 24 if(height[x] == height[y])//如果两个树一样高 25 { 26 height[x] = height[x] + 1; 27 o[y] = x; 28 } 29 else if(height[x] < height[y])//不一样高的时候合并到高度大的树上 30 { 31 o[x] = y; 32 } 33 else 34 o[y] = x; 35 min += w; 36 num ++; 37 } 38 }