标签:
并查集+最小生成树
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 15844 Accepted Submission(s):
6028
#include<stdio.h> #include<algorithm> int set[110]; using namespace std; struct record { int a; int b; int ju; }s[200000]; int find(int fa) { int ch=fa; int t; while(fa!=set[fa]) fa=set[fa]; while(ch!=fa) { t=set[ch]; set[ch]=fa; ch=t; } return fa; } void mix(int x,int y) { int fx,fy; fx=find(x); fy=find(y); if(fx!=fy) set[fx]=fy; } bool cmp(record a,record b) { return a.ju<b.ju; } int main() { int n,m,j,i,sum,ju1,village,k,q,v1,v2; while(scanf("%d",&village)!=EOF) { k=0;m=0; for(i=0;i<=village;i++) { set[i]=i; } for(i=1;i<=village;i++) //注意此处应从1开始,因为没有0号城市 { for(j=1;j<=village;j++) { scanf("%d",&ju1); if(j>i) //此循环计入了所有的两个城市组合之间的距离 { //以及对应城市编号 s[k].a=i; s[k].b=j; s[k].ju=ju1; k++; } } } sort(s,s+k,cmp); scanf("%d",&q); for(i=0;i<q;i++) { scanf("%d%d",&v1,&v2); mix(v1,v2); } sum=0; for(i=0;i<k;i++) { if(find(s[i].a)!=find(s[i].b)) { mix(s[i].a,s[i].b); sum+=s[i].ju; } } printf("%d\n",sum); } return 0; }
标签:
原文地址:http://www.cnblogs.com/tonghao/p/4470553.html