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
",tree[t].num);
48 }
49 return 0;
50 }