POJ 2524 Ubiquitous Religions
世界上宗教何其多。假设你对自己学校的学生总共有多少种宗教信仰很感兴趣。学校有n个学生,但是你不能直接问学生的信仰,不然他会感到很不舒服的。有另外一个方法是问m对同学,是否信仰同一宗教。根据这些数据,相信聪明的你是能够计算学校最多有多少种宗教信仰的。(好,不罗嗦那么多了) 解题思路---->显然并查集了。并查集的详细解释在可以点击 并查集(不相交集合)进行学习。思路可以很清晰的,一开始假设大家都各自信仰一个宗教,那么总的数目ans就是学生数目,每当发现有一对学生信仰同一个宗教,那么ans--;
#include<bits/stdc++.h>
using namespace std;
const int maxn=50000+5;
int fa[maxn];
int findset(int x)
{
return fa[x]==-1? x: fa[x]=findset(fa[x]);
}
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')f=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0')
{
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*f;
}
void print(int x)
{
if(x<0)putchar('-'),x=-x;
if(x>=10)print(x/10);
putchar(x%10+'0');
}
int bind(int u,int v)
{
int fu=findset(u);
int fv=findset(v);
if(fu!=fv)
{
fa[fu]=fv;
return 1;
}
return 0;
}
int main()
{
int n,m;
int kase=0;
while(true)
{
n=read();
m=read();
if(n==0)break;
memset(fa,-1,sizeof(fa));
int cnt = n;//剩余连通分量数目
while(m--)
{
int u,v;
u=read();
v=read();
cnt -= bind(u,v);
}
printf("Case %d: %d\n",++kase,cnt);
}
return 0;
}