并查集模版

转载请注明出处:http://blog.csdn.net/u012860063


直接贴上并查集模板(慎用);

并查集 模板
HDU 1232
#include<cstdio>
int father[1005];
int n, m;
int i;
int find(int x)
{
    return x==father[x]?x:father[x]=find(father[x]);
}
void init()
{
	for(i = 1 ; i <=n ; i++ )
		father[i] = i ;
}
void Union(int x,int y)
{
	int f1=find(x);
	int f2=find(y);
	if(f1!=f2)
	{
		father[f2]=f1;
	}
}
int main()
{
    int a,b;
    while(scanf("%d%d",&n,&m)!=EOF && n)
    {
        init();
        int k=0;
        for(i = 0 ; i < m ; i++ )
        {
            scanf("%d%d",&a,&b);
			Union(a,b);
        }
		for(i=1 ; i <= n ; i++)
			if(father[i]==i)
				k++;
			printf("%d\n",k-1);
    }
    return 0 ;
}


下面:

找是否有儿子

#include<stdio.h>
#include<string.h>
int p[1000],r[1000];
int n, m, i;
int find(int x)
{
	return x==p[x] ? x : p[x]=find(p[x]);
}
void init()
{
	memset(r,0,sizeof(r));
	for(i = 1; i <= n; i++)
		p[i]=i;
}
void Union(int x,int y)
{
	x=find(x);
	y=find(y);
	if(x!=y)
		p[y]=x;
}
int main()
{
	int x,y,root;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		root=0;
		while(m--)
		{
			scanf("%d%d",&x,&y);
			Union(x,y);
			r[x]++;
		}
		for(i = 1; i <= n; i++)
			if(r[i]==0)
				root++;
			if(r[1]==0)
				root=0;
			printf("%d\n",root);
	}
	return 0;
}


你可能感兴趣的:(模板,并查集)