擒贼先擒王
并查集其实就是有联系的将他们确定有共同的东西,为一组,无联系的,你懂的。
#include<stdio.h>
int f[1001]={0},n,m,sum=0;
void init()
{
int i;
for(i=1;i<=n;i++)
f[i]=i;//初始化,数组里面存的是自己数组下标的编号
}
//这是找爹的递归函数,不停的去找爹,直到找到祖宗为止
//擒贼先擒王原则
int getf(int v)
{
if(v==f[v])
return v;
else
{
//这里是路径压缩,每次在函数返回的时候,顺带把路上遇到的人的BOSS改为最后找到的祖宗编号,这样可以提高找到犯罪团伙的最高领导人的速度。
f[v]=getf(f[v]);
return f[v];
}
}
void merge(int v,int u)
{
int t1,t2;
t1=getf(v);
t2=getf(u);
if(t1!=t2)
{
f[t2]=t1;
//靠左原则,左边变成右边的BOSS
}
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;
}
例子
11 10
1 2
3 4
5 2
4 6
2 6
7 11
8 7
9 7
9 11
1 6
运行结果
3