hdu1863(最小生成树,并查集)
这道题比较有意思,除了用并查集外,还可以用prim,k……(不记得怎么写了)来写
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 7 int father[101]; 8 bool flags[101]; 9 10 struct country 11 { 12 int first; 13 int second; 14 int value; 15 }a[5001]; 16 17 bool cmp(country x,country y) 18 { 19 return x.value<y.value; 20 } 21 22 int makeset(int n) 23 { 24 for(int i=1;i<=n;i++) 25 father[i]=i; 26 } 27 28 int findset(int x) 29 { 30 if(father[x]!=x) 31 { 32 father[x]=findset(father[x]); 33 } 34 return father[x]; 35 } 36 37 int Union(int a,int b) 38 { 39 int x=findset(a); 40 int y=findset(b); 41 if(x==y) 42 return 1; 43 else 44 { 45 father[x]=y; 46 return 0; 47 } 48 } 49 50 int main() 51 { 52 int n,m; 53 while(~scanf("%d%d",&n,&m)) 54 { 55 if(n==0) 56 break; 57 int sum=0; 58 makeset(m); 59 memset(flags,false,sizeof(flags)); 60 for(int i=1;i<=n;i++) 61 { 62 63 scanf("%d%d%d",&a[i].first,&a[i].second,&a[i].value); 64 65 } 66 sort(a+1,a+n+1,cmp); 67 68 69 for(int i=1;i<=n;i++) 70 { 71 72 if(Union(a[i].first,a[i].second)==0) 73 { 74 sum=sum+a[i].value; 75 } 76 } 77 78 for(int i=1;i<=m;i++) 79 { 80 flags[findset(i)]=true; 81 } 82 83 int k=0; 84 for(int i=1;i<=m;i++) 85 { 86 if(flags[i]==true) 87 k++; 88 } 89 90 if(k!=1) 91 printf("?\n"); 92 else 93 printf("%d\n",sum); 94 } 95 return 0; 96 }
并查集还挺好用的