hdu 1102 Constructing Roads
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=1102
这题有多组测试数据,表示被坑了……
最小生成树,用Kruskal~
源代码:
1 #include <iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 using namespace std; 5 typedef struct{ 6 int from,to,c; 7 }road; 8 road r[250010]; 9 int fa[510]; 10 int count; 11 12 int cmp(const void *a,const void *b){ 13 return (((road *)a)->c > ((road *)b)->c)?1:-1; 14 } 15 16 int find(int a ) 17 { 18 return fa[a]==a?a:fa[a]=find(fa[a]); 19 } 20 21 int main() 22 { 23 int cas,ans,n,i,j,y; 24 // scanf("%d",&cas); 25 26 while(scanf("%d",&n)!=EOF){ 27 y=0; 28 ans=0; 29 int sum=0; 30 for(i=0;i<n;i++){ 31 int temp_1,temp_2; 32 scanf("%d",&temp_1); 33 fa[i]=i; 34 r[sum].from=r[sum].to=i; 35 r[sum++].c=temp_1; 36 for(j=1;j<n;j++){ 37 scanf("%d",&temp_2); 38 r[sum].from=i; 39 r[sum].to=j; 40 r[sum++].c=temp_2; 41 } 42 } 44 qsort(r,sum,sizeof(road),cmp); 45 int q; 46 scanf("%d",&q); 47 for(i=0;i<q;i++){ 48 int temp_1,temp_2; 49 scanf("%d %d",&temp_1,&temp_2); 50 int fa1=find(temp_1-1); //村庄从0开始标记,所以temp—_1-1 51 int fa2=find(temp_2-1); 52 fa[fa2]=fa1;} 53 for(i=0;i<n;i++) 54 if(fa[i]==i) 55 y++; 57 for(i=0;i<sum;i++){ 58 int fa1=find(r[i].from); 59 int fa2=find(r[i].to); 61 if(fa1!=fa2){ 62 fa[fa2]=fa1; 63 ans+=r[i].c; 65 y--; 67 if(y==1){ 69 70 break;} 71 } 72 } 73 printf("%d\n",ans); 74 } 75 76 return 0; 77 }