标签:
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1301
题目可长 而且还是英文 没必要一字一句的去读题 可以根据下面的输入输出和图来搞清题意
题意:有n个村庄,村庄间有公路,公路保护费用太高,不得已维护某些公路,但必须保证每个村庄间畅通。问最少要维护的道路长度
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,per[30]; struct node{ int b,e,l; }; node edge[1000]; int cmp(node x,node y) { return x.l<y.l; } void init() { for(int i = 1; i <= n; i++) per[i]=i; } int find(int x) { return per[x]==x?x: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 1; } return 0; } int main() { int i,way,dis; char begin,end; while(scanf("%d",&n),n) { int k=0; int sum=0; init(); for(i=1;i<n;i++) { getchar(); scanf("%c%d",&begin,&way); for(int j=0;j<way;j++)//注意变量 表示含义不同 不能用同一字母表示 { getchar(); scanf("%c%d",&end,&dis); edge[k].b=begin-'A'+1;//将字母转化成数字 第一个字母A-'A'+1即为数字1 第二个字母B-'A'+1即为数字2 edge[k].e=end-'A'+1; edge[k].l=dis; k++; } } sort(edge,edge+k,cmp); for(i=0;i<k;i++) { if(join(edge[i].b,edge[i].e)) sum+=edge[i].l; } printf("%d\n",sum); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdoj-1301 Jungle Roads 【最小生成树】
标签:
原文地址:http://blog.csdn.net/qq_29606781/article/details/47608915