本文主要是介绍九度oj 题目1017:还是畅通工程 【ZJU2006考研机试题3】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目1017:还是畅通工程
/* 1.Kruskal算法求最小生成树---畅通工程。两点若连通,则必定在同一集合中,有共同的树根。2.scanf输入掉了&,瞬间无法运行卡死。
*/
#include<stdio.h>
#include<algorithm>
using namespace std;
int ans,parent[101];
struct E{int a,b;int edge;bool operator < (const E &tmp) const{ //运算符重载,定义结构体加法。return edge<tmp.edge;}
}r[5000];
int findRoot(int tmp1)
{if(parent[tmp1]==-1)return tmp1;else{int tmp=findRoot(parent[tmp1]);parent[tmp1]=tmp; //路径压缩return tmp;}
}
int main()
{//freopen("G:\\in.txt","r",stdin);int n,i,sumEdge;while(scanf("%d",&n)!=EOF){if(n==0) break;sumEdge=n*(n-1)/2;ans=0; //全局变量初始化for(i=0;i<sumEdge;i++){scanf("%d%d%d",&r[i].a,&r[i].b,&r[i].edge);}sort(r,r+sumEdge);for(i=0;i<=n;i++) //初始化各结点的父亲 ,从1开始编号,注意上界是小于等于n,不然0分啊。。。。。parent[i]=-1;for(i=0;i<sumEdge;i++){ //按边从小到大遍历一遍,Kruskal算法int a1=findRoot(r[i].a),a2=findRoot(r[i].b);if(a1!=a2){parent[a1]=a2;ans+=r[i].edge;}}printf("%d\n",ans);}return 0;
}
这篇关于九度oj 题目1017:还是畅通工程 【ZJU2006考研机试题3】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!