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 }

并查集还挺好用的

posted on 2012-08-12 16:49  矮人狙击手!  阅读(221)  评论(0编辑  收藏  举报

导航