poj1611 The Suspects(並查集)
阿新 • • 發佈:2017-12-01
con oid sca mes using ++ 如果 problem urn
題目鏈接
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 9void 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 }
poj1611 The Suspects(並查集)