又是一个并查集,题意大概是N个学生,学生0是SARS疑似,学生分为M组,一个学生可以属于不同组,只要和疑似学生在一组,自己也就成了疑似,问最后又多少学生是疑似病例。
Code:
1 #include<stdio.h>
2 #define MAX 30002
3 int m,n;
4 struct type
5 {
6 int father,v;
7 }a[MAX];
8 void initial(int n)
9 {
10 int i;
11 for(i=0;i<n;i++){
12 a[i].father=i;
13 a[i].v=1;
14 }
15 }
16 int find(int n)
17 {
18 if(a[n].father!=n)
19 return find(a[n].father);
20 return n;
21 }
22 void Union(int root1,int root2)
23 {
24 int t1,t2;
25 t1=find(root1);
26 t2=find(root2);
27 if(t1==t2) return ;
28 if(t1!=t2){
29 if(a[t1].v<a[t2].v){
30 a[t1].father=t2;
31 a[t2].v+=a[t1].v;
32 }
33 else{
34 a[t2].father=t1;
35 a[t1].v+=a[t2].v;
36 }
37 }
38 }
39 int main()
40 {
41 int cas,i,j,k,p,q,N,M;
42 while(scanf("%d%d",&N,&M)!=EOF){
43 if(N==0&&M==0) break;
44 initial(N);
45 for(i=1;i<=M;i++){
46 scanf("%d",&k);
47 scanf("%d",&p);
48 for(j=2;j<=k;j++){
49 scanf("%d",&q);
50 Union(p,q);
51 }
52 }
53 k=find(0);
54 printf("%d\n",a[k].v);
55 }
56
57
58 }