hdu 1863 畅通工程(kruskal算法)

来源:互联网 发布:分类信息采集软件 编辑:程序博客网 时间:2024/06/05 05:14

本题链接:点击打开链接

本题题意:

       有n条路m个村庄,输入每条路连接哪两个村庄,及修该段路的费用,求使所有村庄均可畅通(并非两两均连通)

的最少费用。

解题思路:

        此题与hdu 1233 还是畅通工程  相类似,均是使用kruskal算法思想。

具体请参考代码:

#include<stdio.h>#include<algorithm>using namespace std;int per[110];int n,m;struct node{int u,v,w;}a[110];int cmp(node a,node b){return a.w<b.w;}void init(){for(int i=1;i<=m;i++)per[i]=i;}int find(int x){if(x==per[x])return x;return per[x]=find(per[x]);}bool join(int x,int y){int fx=find(x);int fy=find(y);if(fx!=fy){per[fx]=fy;return true;}elsereturn false;}int main(){while(scanf("%d%d",&n,&m),n){for(int i=0;i<n;i++)scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);init();if(n<m-1){printf("?\n");continue;}sort(a,a+n,cmp);int sum=0;for(int i=0;i<n;i++){if(join(a[i].u,a[i].v)){sum+=a[i].w;}}int cnt=0;for(int i=1;i<=m;i++)if(i==per[i])cnt++;if(cnt==1)printf("%d\n",sum);elseprintf("?\n");}return 0;}


 

0 0