hdu 1232 并查集

点击打开链接http://acm.hdu.edu.cn/showproblem.php?pid=1232
#include <stdio.h>
#define M 1010
int par[M];

int find(int x)
{
	int k,t,y;
	k=x;
	while(par[x]!=x)
	{
		x=par[x];
	}
	
	while(k!=x)  	//路径压缩 	
	{				//  把所有的中间节点 加入到根节点的直接后继 
		
		y=par[k];
		par[k]=x;
	
		k=y;	
	}
	
	return x;
	
}


void join(int a,int b)
{
	int x,y;
	x=find(a);
	y=find(b);
	
	par[y]=x; //老大合并 
	
}
int main()
{
	int n,e,a,b,i,ans,x,y;
	while(scanf("%d",&n)&&n) 
	{
		scanf("%d",&e);
		ans=0;
		for(i=1;i<=n;i++)
		{
			par[i]=i;
		}
		
		while(e--)
		{
			scanf("%d%d",&a,&b);
			join(a,b);
		}
		for(i=1;i<n;i++)
		{
			if(find(i)!=find(i+1))
			{
				ans++;
				join(i,i+1);
			}		
		}
		printf("%d\n",ans);
	}
	return 0;
}

你可能感兴趣的:(hdu 1232 并查集)