基础的并查集

step1:首先将每个节点视为根节点,初始化每个节点的父节点是自己。

step2:如果要使不同宗教最多,那就是每个人的都不同,那么最大的宗教数就是人数了。

step3:设输入一对宗教相同的,且这两人当前不属于同一集合,则最大的宗教数减1。

step4:当所有的输入结束后,结果就出来了。

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

 1 #include<stdio.h>
 2 int f[50005],sum;
 3 int find(int x)
 4 {
 5     if(f[x]!=x)
 6         f[x]=find(f[x]);
 7     return f[x];
 8 }
 9 void make(int a,int b)
10 {
11     int f1=find(a);
12     int f2=find(b);
13     if(f1!=f2)
14         {
15             f[f2]=f1;
16             sum--;
17         }
18 
19 }
20 int main()
21 {
22     int n,m,p=1,i;
23     while(scanf("%d%d",&n,&m)!=EOF)
24     {
25         if(n==0&&m==0)  break;
26         for(i=1;i<=n;i++)
27             f[i]=i;
28         sum=n;
29         for(i=1;i<=m;i++)
30         {
31             int a,b;
32             scanf("%d%d",&a,&b);
33             make(a,b);
34         }
35         printf("Case %d: %d\n",p++,sum);
36     }
37     return 0;
38 }

 

posted @ 2014-02-26 22:08  清风旋叶  阅读(132)  评论(0编辑  收藏  举报