标签:des style blog color io os ar java for
3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100
3 ?#include<stdio.h> #include<algorithm> using namespace std; int pre[105]; struct st { int a,b; int p; }data[105]; int find(int n) //找结点的根; { return pre[n]==n?n:pre[n]=find(pre[n]); } int join(int x,int y) // { int fx=find(x),fy=find(y); if(fx!=fy) //如果两结点的根并非为同一个点,连接起来。 { pre[fx]=fy; return 1; } return 0; } int cmp(st a,st b) //将修路的价钱按升序排列。 { return a.p<b.p; } int main() { int i,m,n; while(~scanf("%d %d",&m,&n),m) { for(i=1;i<=n;i++) //将结点独立(初始化); { pre[i]=i; } for(i=1;i<=m;i++) { scanf("%d %d %d",&data[i].a,&data[i].b,&data[i].p); } sort(data+1,data+m+1,cmp); //从i=1排序,n个数据,所以是sort(data+1,data+m+1,cmp); int sum=0,ans=0; for(i=1;i<=m;i++) { if(join(data[i].a,data[i].b)) //如果两节点的根为同一个根,则不需要修路,反之选修路花费较少的一条路(排序的作用)。 { sum+=data[i].p; } } for(i=1;i<=n;i++) //统计剩下孤立点的个数,间接统计需要修多少路。 { if(pre[i]==i) { ans++; } } if(ans>1) printf("?\n"); else printf("%d\n",sum); } return 0; }
标签:des style blog color io os ar java for
原文地址:http://blog.csdn.net/hdd871532887/article/details/40348905