并查集+最小生成树
Constructing RoadsTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 15844 Accepted Submission(s):
6028
We know that there are already some roads between some villages and your job is the build some roads such that all the villages are connect and the length of all the roads built is minimum.
Then there is an integer Q (0 <= Q <= N * (N + 1) / 2). Then come Q lines, each line contains two integers a and b (1 <= a < b <= N), which means the road between village a and village b has been built.
#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; }