模板整理——图论·最小生成树·Kruskal
2017-10-26 22:40
435 查看
思想:把所有边按权值从小到大排序,每次取最小的未处理边e,若e连接的两个点u,v不在同一集合,则将e加入最小生成树,将u,v放入同一集合(并查集),一共需要加入n-1条边
时间复杂度:O(mlgm)
代码是这题的–>__–>HDU1863畅通工程
时间复杂度:O(mlgm)
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int fa[105]; struct node { int u,v,l; }e[105]; bool cmp(node t1,node t2) { return t1.l<t2.l; } int Find(int u) { if (u==fa[u]) return u; fa[u]=Find(fa[u]); return fa[u]; } void Union(int u,int v) { int x=Find(u),y=Find(v); fa[y]=x; } int main() { int n,m; scanf("%d%d",&m,&n); while (m!=0) { int num=0; for (int i=1; i<=n; i++) fa[i]=i; memset(e,0,sizeof(e)); for (int i=1; i<=m; i++) { int u,v,l; scanf("%d%d%d",&u,&v,&l); e[++num].u=u; e[num].v=v; e[num].l=l; } sort(e+1,e+1+num,cmp); int s=0,ans=0; for (int i=1; i<=num; i++) { int u=e[i].u,v=e[i].v; if (Find(u)!=Find(v)) { s++; Union(u,v); ans+=e[i].l; if (s==n-1) break; } } if (s<n-1) printf("?\n"); else printf("%d\n",ans); scanf("%d%d",&m,&n); } return 0; }
代码是这题的–>__–>HDU1863畅通工程
相关文章推荐
- 模板整理: 图论---最小生成树
- 最小生成树模板(Kruskal和prim)
- 个人模板 Kruskal 最小生成树
- 夕拾算法进阶篇:35)最小生成树Kruskal(图论)
- 图论——最小生成树Prim算法模板
- hdu 1863 畅通工程 最小生成树模板入门题 prim+kruskal两种算法AC。
- 最小生成树-kruskal 模板
- 最小生成树---Kruskal---模板
- 图论-最小生成树-Kruskal
- 最小生成树模板(POJ 1258-prime+HDU 1233 Kruskal为例)
- 51nod 1212 无向图最小生成树(prim,kruskal模板)
- [备战NOI同步赛]Kruskal最小生成树模板
- Kruskal模板求最小生成树
- 图论--最小生成树总结(Prim&&Kruskal)
- 图论中最小生成树算法-Prim(普里姆)算法、kruskal(克鲁斯卡尔避圈法)算法、破圈算法
- 数据结构之 图论---最小生成树(prim + kruskal)
- 算法提高 最小方差生成树(Kruskal)_模板
- 最小生成树(kruskal模版 模板)
- 最小生成树---kruskal模板(并查集优化)
- 练习赛2(补题)问题 G: 建设电力系统【最小生成树kruskal模板题】