(复习)图论--最小生成树--Kruskal算法
2016-08-06 09:25
369 查看
定义:克鲁斯卡尔算法是在剩下的所有未选取的边中,找最小边,如果和已选取的边构成回路,则放弃,选取次小边。(引自百度百科)
思路:读边后将边按照边权从小到大排序,每次选择一条可选的最小边,其中对于可选的定义为:边的两点不在同一个集合内,既选中这条边不会使图出现环。这个过程要用并查集实现,由于递归层数可能会很大(我就因为写了递归RE无数次)所以说这里面的find函数我写成了非递归。
实现:邻接表+并查集。
**时间复杂度:**O(ElogE) E为图中的边集
思路:读边后将边按照边权从小到大排序,每次选择一条可选的最小边,其中对于可选的定义为:边的两点不在同一个集合内,既选中这条边不会使图出现环。这个过程要用并查集实现,由于递归层数可能会很大(我就因为写了递归RE无数次)所以说这里面的find函数我写成了非递归。
实现:邻接表+并查集。
**时间复杂度:**O(ElogE) E为图中的边集
/* 2016.8.6 BulaBula CHN */ #include<cstdio> #include<cstdlib> #include<cmath> #include<algorithm> #include<string> #include<cstring> #include<iostream> using namespace std; struct Edge { int from,to; int val; }eage[100005]; int tot=0; void add(int x,int y,int z) { eage[++tot].from=x; eage[tot].to=y; eage[tot].val=z; } bool cmp(Edge a,Edge b) {return a.val<b.val;} int n,m; int ans=0; int f[10005]; int findroot(int x)//非递归找根节点 { int k,j,r; r=x; while(r!=f[r]) r=f[r]; k=x; while(k!=r) { j=f[k]; f[k]=r; k=j; } return r; } int main() { freopen("textdata.in","r",stdin); freopen("textdata.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z); } for(int i=1;i<=n;i++) f[i]=i; sort(eage+1,eage+1+m,cmp); for(int i=1;i<=m;i++) { int x,y; x=eage[i].from; y=eage[i].to; int g1=findroot(x); int g2=findroot(y); if(g1==g2) continue; else { f[g1]=g2; ans+=eage[i].val; } } printf("%d",ans); fclose(stdin); fclose(stdout); return 0; } /* textdata.in 6 9 1 3 4 1 2 3 2 5 2 2 6 3 2 3 2 3 4 1 4 5 5 4 6 4 5 6 3 textdata.out 11 */
相关文章推荐
- 最小生成树之Kruskal算法(图论) By ACReaper
- [算法与数据结构] - No.9 图论(2)- 最小生成树Prim算法与Kruskal算法
- 图论中最小生成树构造算法之Prim算法和Kruskal算法
- 【图论】最小生成树之prim算法与kruskal算法
- 图论-最小生成树-prime算法&Kruskal算法 c++
- (复习)图论--最小生成树--Prim算法
- 紫书第十一章-----图论模型与算法(最小生成树prim算法和kruskal算法)
- 图论(九)最小生成树-Kruskal算法
- 【最小生成树】图论复习(三)
- 图论——最小生成树Kruskal算法模板
- 「图论」最小生成树-kruskal算法
- 求最小生成树的Kruskal算法
- 最小生成树Kruskal算法【模板】 与 并查集 例题:简单 poj 2485 Highways
- 最小生成树之Kruskal算法
- 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)
- 最小生成树Kruskal算法朴素版 C语言实现
- 最小生成树kruskal算法
- 最小生成树 kruskal算法 归纳
- 最小生成树-Prim算法和Kruskal算法
- 2016最小生成树Kruskal算法1001