例题
现有11个强盗。
1号与2号是同伙。
3号与4号是同伙。
5号与6号是同伙。
4号与6号是同伙。
2号与6号是同伙。
7号与11号是同伙。
8号与7号是同伙。
9号与7号是同伙。
9号与11号是同伙。
1号与6号是同伙。
注意:同伙的同伙是同伙,根据条件求出有多少独立团伙。
解题原则:::靠左原则和擒贼先擒王原则
代码
#include<stdio.h>
int f[1001]={0},n,m,sum=0;//将定义的数组初始化
void init()
{
int i;
for(i=1;i<=n;i++)
f[i]=i;
return ;
}
//递归函数,擒贼先擒王原则
int getf(int v)
{
if(f[v]===v)
return v;
else
{
f[v]=getf(f[v]);//路径压缩
return f[v];
}
}
//合并两个集合
void merge(int v,int u)
{
int t1,t2;//两个变量分别为两边的boss,然后合并
t1=hetf(v);
t2=getf(u);
if(t1!=t2)//判断是否在同一集合
{
f[t2]=t1;//靠左原则,右边归顺左边
}
return ;
}
int main()
{
int i,x,y;
scanf("%d %d",&n,&m);
init();
for(i=1;i<=m;i++)
{
//合并
scanf("%d %d"&x,&y);
merge(x,y);
}
//扫描犯罪团伙
for(i=1;i<=n;i++)
{
if(f[i]==i)
sum++;
}
printf("%d\n",sum);
return 0;
}