还是畅通工程(Kruskal)
来源:互联网 发布:cad软件手机版 编辑:程序博客网 时间:2024/06/05 11:10
题目网址:还是畅通工程
原理:(并查集和最小生成树思想的结合)
(1)初始时所有的节点都属于孤立的集合;
(2)按照边权值递增的顺序遍历所有的边,若遍历到的边两个顶点仍分属于不同的集合,则确定该边为最小生成树上的一条边,并将这两个顶点所在的集合合并;
(3)遍历完所有的边,原图上所有的结点都属于同一个集合则被选取的边和原图中所有的结点构成了最小生成树;否则原图不连通,最小生成树不存在。
题目解法:定义一个结构体用来表示每一条边,按照权值进行排,然后依照上述原理进行求解。
#include<iostream>#include<algorithm>using namespace std;int parent[101];int findroot(int x){if (parent[x] != x)parent[x] = findroot(parent[x]);return parent[x];}struct edge{int a, b;int cost;bool operator < (const edge &A)const{//函数重载小于号,使得边可以按照从小到大排序return cost < A.cost;}}e[6000];int main(){int n;while (cin >> n&&n){for (int i = 0; i<(n - 1)*n / 2; i++){cin >> e[i].a >> e[i].b >> e[i].cost;}sort(e, e + n*(n - 1) / 2);for (int i = 1; i <= n; i++){parent[i] = i;//并查集的初始化,使得所有节点都是一个孤立的集合}int ans = 0;//保存最后的结果for (int i = 0; i < n*(n - 1) / 2; i++){int a = findroot(e[i].a);int b = findroot(e[i].b);if (a != b){parent[a] = b;ans += e[i].cost;}}cout << ans << endl;}system("pause");return 0;}
阅读全文
0 0
- 还是畅通工程(Kruskal)
- 还是畅通工程(水题) kruskal算法
- HDU:1233 还是畅通工程(kruskal)
- 【hdu 1233】还是畅通工程(kruskal)
- HDU 1233 还是畅通工程(Kruskal)
- hdu1233-还是畅通工程(Kruskal)
- HD1233 还是畅通工程 【Kruskal】
- 1233 还是畅通工程(kruskal)
- HDU-#1233 还是畅通工程(Prim & Kruskal)
- hdu1233 - 还是畅通工程 (求最小生成树)(Kruskal)
- hdu1233 还是畅通工程(kruskal算法) 解题报告
- HDOJ 1233 还是畅通工程(最小生成树--kruskal)
- 杭电-1233还是畅通工程(kruskal,prim)
- hdu1233 还是畅通工程 (kruskal求最小生成树)
- HDU 1233 还是畅通工程(最小生成树Kruskal)
- HDU 1233 还是畅通工程(kruskal&&prim)
- HDU1233-还是畅通工程(Prim算法+Kruskal算法)
- HDU 1233 还是畅通工程 (最小生成树 Kruskal)
- JS实践——拖拽
- Java高并发--等待通知和挂起继续执行
- 重写和重载知识总结
- C 知识点(4)
- 我对printf函数的一些理解
- 还是畅通工程(Kruskal)
- C 知识点(5)
- Territorial Dispute
- 非监督特征学习与深度学习(十二)---- 卷积神经网络
- vector drawable
- Python回顾
- MySQL LIKE 子句
- elipse快捷键
- 深入理解SELinux SEAndroid