最小生成树kruskal算法
2013-12-02 23:23
260 查看
最小生成树(最小权值生成树的简称)。
原理:每次选择一条最小权边,直至构成一棵最小生成树。
最小生成树的构建过程:
1.排序。将图中所有边的权值按从小到大的顺序排列成L:T<-NULL.
2.当|T|<n-1时重复下面操作:
a。选L中的最小权边e。
b。若TU{e}中不存在回路,将e加入T:T<-TU{e}。
c。从L中删除e:L<-L-{e}.
3.结束。
代码如下:
//并查集操作 int findfather(int i) { if(root[i] == i) return root[i] ; else return findfather(root[i]); }
void makeset(int i) { root[i] = i; heavy[i] = 1 ; }
void unio(int i , int j) { if(heavy[i] >= heavy[j]) { root[j] = i ; heavy[i] = heavy[i] + heavy[j] ; } else { root[i] = j ; heavy[j] = i ; } }
typedef struct { int x , y , distance ; }Edge ;
void kruskal() { sort(g.begin() , g.end() , com) ; int shortlength = 0 ; int s , t ; for(int i = 0; i < n; i ++) { s = root[g[i].x] ; t = root[g[i].y] ; if(s != t) { shortlength = shortlength + g[i].distance ; unio(s , t) ; } } }
上面的findfather()函数还是路径压缩下比较好。
代码如下:
int findfather(int i) { int k , j ; j = i ; while(root[i] != i) { i = root[i] ; } while(j != i) { k = root[j] ; root[j] = i ; j = k ; } return i ; }
相关文章推荐
- 邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)
- 【最小生成树】Prim算法和Kruskal算法
- 最小生成树-Kruskal算法(模板) 蓝桥杯 - 算法训练 - ALGO - 6 安慰奶牛(克鲁斯卡尔)
- 最小生成树~kruskal算法
- 最小生成树之Prim算法,Kruskal算法
- 最小生成树(Kruskal算法)贪心算法 利用并查集
- Kruskal算法最小生成树
- 最小生成树-Prim算法和Kruskal算法
- Kruskal算法(求最小生成树)
- hdu 还是畅通工程 (基础)(最小生成树)(Prim算法 && Kruskal算法)
- hdu 畅通工程再续(最小生成树)(Prim算法 && Kruskal算法)
- 最小生成树-Prim算法和Kruskal算法
- 最小生成树kruskal算法
- 最小生成树--Prim和Kruskal算法
- Jobdu1144 Freckles(最小生成树,Kruskal算法)
- 最小生成树-Prim算法和Kruskal算法
- 学习笔记--最小生成树之kruskal算法
- 图论算法:最小生成树——Prim算法和Kruskal算法C++实现
- HDU1233还是畅通工程(最小生成树 Kruskal算法)
- 九度 OJ 题目1144:Freckles (kruskal算法 最小生成树)