Description
Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized as a global threat in mid-March 2003. To minimize transmission to others, the best strategy is to separate the suspects from others.Input
The input file contains several cases. Each test case begins with two integers n and m in a line, where n is the number of students, and m is the number of groups. You may assume that 0 < n <= 30000 and 0 <= m <= 500. Every student is numbered by a unique integer between 0 and n−1, and initially student 0 is recognized as a suspect in all the cases. This line is followed by m member lists of the groups, one line per group. Each line begins with an integer k by itself representing the number of members in the group. Following the number of members, there are k integers representing the students in this group. All the integers in a line are separated by at least one space.Output
For each case, output the number of suspects in one line.Sample Input
100 4 2 1 2 5 10 13 11 12 14 2 0 1 2 99 2 200 2 1 5 5 1 2 3 4 5 1 0 0 0
Sample Output
4 1 1
題目大意:找0所在集合的成員個數
題目鏈接:http://poj.org/problem?id=1611
代碼:
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int f[30008]; int num[30008]; int find(int n) { if(n!=f[n]) f[n]=find(f[n]); return f[n]; } int main() { int n,m; while(cin>>n>>m) { if(n==0&&m==0) break; for(int i=0;i<n;i++) {f[i]=i;num[i]=1;} int a,b,c; for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); for(int j=1;j<a;j++) { scanf("%d",&c); int b1=find(b),c1=find(c); if(b1!=c1) { f[c1]=b1; num[b1]+=num[c1]; } } } cout<<num[find(0)]<<endl; } return 0; }