poj1611 The Suspects(并查集)
题目链接
http://poj.org/problem?id=1611
题意
有n个学生,编号0~n-1,m个社团,每个社团有k个学生,如果社团里有1个学生是SARS的疑似患者,则该社团所有人都要被隔离。起初学生0是疑似患者,求要隔离多少人。
思路
使用并查集求解。
代码
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int N = 30000 + 10; 7 int p[N]; 8 9 void make_set(int n) 10 { 11 for (int i = 0; i < n; i++) 12 p[i] = i; 13 } 14 15 int find_root(int x) 16 { 17 if (x == p[x]) 18 return x; 19 else 20 { 21 int temp = find_root(p[x]); //路径压缩 22 p[x] = temp; 23 return temp; 24 } 25 } 26 27 void union_set(int x, int y) 28 { 29 int px = find_root(x); 30 int py = find_root(y); 31 if (px != py) 32 p[px] = py; 33 } 34 35 int main() 36 { 37 freopen("poj1611.txt", "r", stdin); 38 int n, m; 39 while (scanf("%d%d", &n,&m)==2 && n) 40 { 41 make_set(n); 42 for (int i = 0; i < m; i++) 43 { 44 int k; 45 int x, y; 46 scanf("%d%d", &k, &x); 47 for (int j = 1;j < k;j++) 48 { 49 scanf("%d", &y); 50 union_set(x, y); 51 x = y; 52 } 53 } 54 int root = find_root(0); 55 int ans = 0; 56 for (int i = 0; i < n; i++) 57 if (find_root(i) == root) 58 ans++; 59 cout << ans << endl; 60 } 61 return 0; 62 }
本站使用「CC BY-NC-SA」创作共享协议,转载请在文章明显位置注明作者及出处。