| 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 50005using
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