现在的位置: 首页 > 综合 > 正文

hdu 1272小希的迷宫(并查集判断无向图回路)

2013年06月27日 ⁄ 综合 ⁄ 共 840字 ⁄ 字号 评论关闭

并查集~~~

判断图是否连通且无回路

待连接的两点如果祖先节点相同,那么就构成回路

#include<stdio.h>
#define max(a,b) a>b?a:b
#define min(a,b) a<b?a:b
int father[100001],vis[100001],ans;
int findfather(int a){
	if(father[a]!=a)
		father[a]=findfather(father[a]);
	return father[a];
}
void merge(int a,int b){
	int x,y;
	x=findfather(a);
	y=findfather(b);
	if(x!=y)father[x]=y;
	else ans=0;        
}
int main()
{
	int a,b,mini,maxi,cnt,i,x,y;
	while(scanf("%d%d",&a,&b),a!=-1){
		if(a==0)              //到现在我也不明白为啥0,0时是Yes,不是No
		{
			printf("Yes/n");continue;
		}
		for(i=1;i<=100000;i++){
			vis[i]=0;father[i]=i;
		}
		vis[a]=vis[b]=1;
		mini=min(a,b);
		maxi=max(a,b);
		merge(a,b);
		ans=1;
		while(scanf("%d%d",&a,&b),a+b)    //看是否存在回路
		{
			x=min(a,b),y=max(a,b);
			if(x<mini) mini=x;
			if(y>maxi) maxi=y;merge(a,b);
			vis[a]=vis[b]=1;
		}
		for(cnt=0,i=mini;i<=maxi;i++)     //看图是否连通
		{
			if(father[i]==i && vis[i])cnt++;
			if(cnt>1)       //连通图中只有根节点的父节点是自身,cnt应该是1
			{
				ans=0;break;
			}
		}
		if(ans) printf("Yes/n");
		else printf("No/n");
	}
	return 0;
}

抱歉!评论已关闭.