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 }

 

posted @ 2013-08-09 14:31  小の泽  阅读(172)  评论(0编辑  收藏  举报