Ubiquitous Religions--POJ 2524

1、解题思路:并查集。

2、注意事项:借用father[]、rank[]两个数组记录的小技巧。

3、实现方法:

  
    
1 #include < iostream >
2 #define M 50010
3 using namespace std;
4
5 int father[M],rank[M],ans;
6
7 void Makeset( int x)
8 {
9 father[x] = x;
10 rank[x] = 0 ;
11 }
12
13 int Findfather( int x)
14 {
15 if (x != father[x])
16 father[x] = Findfather(father[x]);
17 return father[x];
18 }
19
20 void Union( int x, int y)
21 {
22 int a = Findfather(x);
23 int b = Findfather(y);
24 if (a != b)
25 {
26 if (rank[a] > rank[b])
27 father[b] = a;
28 else
29 {
30 if (rank[a] == rank[b])
31 rank[b] ++ ;
32 father[a] = b;
33 }
34 ans -- ;
35 }
36 }
37
38 int main()
39 {
40 int i,j,n,m,tmp1,tmp2,cnt = 0 ;
41 while (cin >> n >> m)
42 {
43 if ( ! n && ! m)
44 break ;
45 for (j = 1 ;j <= n;j ++ )
46 Makeset(j);
47 ans = n;
48 for (i = 0 ;i < m;i ++ )
49 {
50 scanf( " %d %d " , & tmp1, & tmp2);
51 Union(tmp1,tmp2);
52 }
53 cout << " Case " <<++ cnt << " : " << ans << endl;
54 }
55 return 0 ;
56 }

 

 

 

你可能感兴趣的:(poj)