M.J的blog

algorithm,ACM-ICPC
随笔 - 39, 文章 - 11, 评论 - 20, 引用 - 0
数据加载中……

POJ The Suspects(并查集)

又是一个并查集,题意大概是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==0break;
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 }

posted on 2010-04-24 15:06 M.J 阅读(152) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理