Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 22612 | Accepted: 11140 |
Description
Input
Output
Sample Input
10 9 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 10 4 2 3 4 5 4 8 5 8 0 0
Sample Output
Case 1: 1 Case 2: 7
简单并查集,不解释。。。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 |
/*====================================================================== * Author : kevin * Filename : UbiquitousReligions.cpp * Creat time : 2014-05-15 11:28 * Description : ========================================================================*/ #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <queue> #include <cmath> #define clr(a,b) memset(a,b,sizeof(a)) #define M 50005 using
namespace std; int
s[M],father[M],rank[M]; int
n,m; void
make_set() { for ( int
i = 1; i <= n; i++){ father[i] = i; rank[i] = 0; } } int
find_set( int
x) { if (x != father[x]){ father[x] = find_set(father[x]); } return
father[x]; } void
Union( int
x, int y) { x = find_set(x); y = find_set(y); if (x == y){ return
; } if (rank[x] > rank[y]){ father[y] = x; } else { if (rank[x] == rank[y]){ rank[y]++; } father[x] = y; } } int
main( int
argc, char
*argv[]) { int
cas = 1; while ( scanf ( "%d%d" ,&n,&m)!=EOF && n+m){ make_set(); int
a,b; for ( int
i = 0; i < m; i++){ scanf ( "%d%d" ,&a,&b); Union(a,b); } clr(rank,0); int
cnt = 0; for ( int
i = 1; i <= n; i++){ int
x = find_set(i); if (x == i) cnt++; } printf ( "Case %d: %d\n" ,cas++,cnt); } return
0; } |
poj 2524 -- Ubiquitous Religions,布布扣,bubuko.com
poj 2524 -- Ubiquitous Religions
原文地址:http://www.cnblogs.com/ubuntu-kevin/p/3729750.html