题目链接:http://poj.org/problem?id=2524
虽然说在训练计划里归类到了分治,但是用并查集A掉的,其实真心不知道怎么用分治做这个题目。
先说说题的大意,就是有n个人,m组数据,说了那两个人信仰相同,问这n个人几种信仰
这种集合归类的题目明显就是并查集,注意一下路径压缩,1Y。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int per[60000];
bool bj[60000];
int fin (int a)
{
int r = a;
while (per[r] != r)
r = per[r];
int k ;
while (a != r)
{
k = a;
per[a] = r;
a = per[k];
}
return r;
}
int add (int a,int b)
{
per[fin(a)] = fin(b);
return 0;
}
int main()
{
int p,n;
int NO = 0;
while (~scanf ("%d%d",&p,&n) && (p || n))
{
int i,k;
for (i = 0;i <= p;i++)
per[i] = i;
for (i = 0;i < n;i++)
{
int a,b;
scanf ("%d%d",&a,&b);
add (a,b);
}
for (i = 0;i <= p;i++) //再一次压缩路径,保证每一个成员最大深度为1
per[i] = fin (i);
memset (bj,0,sizeof (bj));
for (i = 0;i <= p;i++)
bj[per[i]] = 1;
int ans = 0;
for (i = 1;i <= p;i++)
if (bj[i])
ans++;
printf ("Case %d: %d\n",++NO,ans);
}
return 0;
}