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 }