hdu 2122 Ice_cream’s world III

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=2122

注意考虑只有一个城市的情况!!!还有题目有点问题,应该是接下来一共m行~~~

赤果果的最小生成树,用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[10000010];
 9 int fa[1010];
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 ans,n,m,i,j;
24 
25 
26     while( scanf("%d %d",&n,&m)!=EOF){
27        int sum=0;
28        int ok=0;
29        ans=0;
30        for(i=0;i<n;i++)
31          fa[i]=i;
32      for(i=0;i<m;i++){
33          int temp_1,temp_2,c;
34          scanf("%d %d %d",&temp_1,&temp_2,&c);
35          r[sum].from=temp_1;
36          r[sum].to=temp_2;
37          r[sum++].c=c;
38          r[sum].from=temp_2;
39          r[sum].to=temp_1;
40          r[sum++].c=c;
41 
42      }
43      qsort(r,sum,sizeof(road),cmp);
45   if(n==1)ok=1; //只有一个城市
46     else for(i=0;i<sum;i++){
47        int fa1=find(r[i].from);
48        int fa2=find(r[i].to);
49        if(fa1!=fa2){
50          fa[fa2]=fa1;
51          n--;
52          ans+=r[i].c;
54          if(n==1){
56         ok=1;
57          break;}
58        }
59      }
60     if(ok==1) printf("%d\n\n",ans);
61     else printf("impossible\n\n");
62    }
63     return 0;
64 }

 

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