感染者

step1:结构体中包括两个元素,一个是该节点的父节点,一个是以该节点为根节点的树的节点数目。初始化时每个节点视为一棵独立的树,这棵树中的元素只有1个。

step2:输入每对关联的点时进行并操作,将两棵树的节点之和记录在合并之后的树根上。

step3:输入结束后,查询编号0节点的根节点,这个根节点上记录的节点数目就是所求的结果。

http://poj.org/problem?id=1611

 1 #include<stdio.h>
 2 #include<string.h>
 3 typedef struct
 4 {
 5     int pre,num;
 6 }Tree;
 7 Tree tree[30000];
 8 int find(int x)
 9 {
10     if(tree[x].pre==x)
11         return x;
12     return tree[x].pre=find(tree[x].pre);
13 }
14 void make(int a,int b)
15 {
16     int f1=find(a);
17     int f2=find(b);
18     if(f2!=f1)
19     {
20         tree[f1].num+=tree[f2].num;
21         tree[f2].pre=f1;
22     }
23 }
24 int main()
25 {
26     int m,n,i,j,k;
27     while(scanf("%d%d",&n,&m)!=EOF)
28     {
29         if(n==0&&m==0)  break;
30         for(i=0;i<n;i++)
31         {
32             tree[i].pre=i;
33             tree[i].num=1;
34         }
35         int a,b;
36         while(m--)
37         {
38             scanf("%d",&k);
39             scanf("%d",&a);
40             for(i=1;i<k;i++)
41             {
42                 scanf("%d",&b);
43                 make(a,b);
44             }
45         }
46         int t=find(0);
47         printf("%d\n",tree[t].num);
48     }
49     return 0;
50 }

 

posted @ 2014-02-27 15:13  清风旋叶  阅读(120)  评论(0编辑  收藏  举报