1. 程式人生 > >poj1611 The Suspects(並查集)

poj1611 The Suspects(並查集)

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 
 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 }

poj1611 The Suspects(並查集)