poj 2524
并查集基础题,但是由于刚开始不熟悉,还是错了好几次
题目大意:有学生学号1--n,给你一些学生之间的关系,即属于同一宗教的学生, 找出共有多少不同的宗教数
解决:就是一个并查集的最基础题目,写个并查集就过了
#include <stdio.h>
#include <string.h>
int num[50005];
int n,m;
int find(int x)//查找
{
if(num[x]<0)return x;
return num[x]=find(num[x]);
}
void merge(int a,int b)//合并
{//就是因为对合并算法不熟悉,导致错误了好几次,fa和fb代表的是两个集合,而并非a,
int fa=find(a);
int fb=find(b);
int i;
if(fa==fb)return;
int t=num[fa]+num[fb];
if(num[fa]>num[fb]){num[fa]=fb;num[fb]=t;}
else {num[fb]=fa;num[fa]=t;}
}
int main()
{
int icase=1;
while(scanf("%d%d",&n,&m),n||m)
{
int a,b,i,count=0;
memset(num,-1,sizeof(num));
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
merge(a,b);
}
for( i=1;i<=n;i++)
{
if(num[i]<0)count++;
}
printf("Case %d: %d\n",icase++,count);
}
// system("pause");
return 0;
}