啊哈算法-擒贼先擒王(并查集)

52 阅读1分钟

n个强盗,m表示警方的线索,接下来m行,每行两个整数a,b表示a强盗和b强盗是同伙,问一共有多少个团伙

样例输入:

10 9
1 2
3 4
5 2
4 6
2 6
8 7
9 7
1 6
2 4

样例输出:

3

程序代码:

#include<stdio.h>
int getf(int v);
void merge(int u,int v);
int f[110];
int main()
{
	
	int i,n,m,x,y,sum=0;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
		f[i]=i;
	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;
}
int getf(int v)
{
	if(v==f[v])
		return v;
	f[v]=getf(f[v]);
	return f[v];
}
void merge(int u,int v)
{
	u=getf(u);
	v=getf(v);
	if(u!=v)
		f[v]=u;
	return;
}