hdu1272小希的迷宫(并查集--判断是否有环的存在)

1.题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1272

 

2.思路:

   并查集判断连通性,要注意0 0这数据的结果是Yes,还有边数=点数-1,那个查找的函数不要用递归,不然会RE,Orz~~~

 

3.参考代码:

 

#include <stdio.h>
#include <string.h>

#define N 100005
int root[N];
int vis[N];
int flag;

int find(int x){   ///用递归就RE了,难道栈爆掉了?
//	if(x==root[x])
//		return x;
//	return root[x]=find(root[x]);
	while(x!=root[x])
		x=root[x];
	return x;
}

void merge(int x,int y){
	int a=find(x);
	int b=find(y);
	if(a!=b)
		root[a]=b;
	else
		flag=0;   ///同根节点,即成环
} 

int main()
{
	int i,a,b;
	while(~scanf("%d%d",&a,&b))
	{
		if(a==-1 && b==-1)
			break;
		if(a==0 && b==0)
		{
			printf("Yes\n");
			continue;
		}
		for(i=0;i<N;i++)
		{
			root[i]=i;
			vis[i]=0;
		}
		flag=1;
		merge(a,b);
		vis[a]=vis[b]=1;  
		while(~scanf("%d%d",&a,&b))
		{
			if(a==0 && b==0)
				break;
			merge(a,b);
			vis[a]=vis[b]=1; 
		}
		int ans=0;
		for(i=0;i<N;i++)
		{
			if(root[i]==i && vis[i])   ///判断根节点的数目
				ans++;
			if(ans>1)
				flag=0;
		}
		if(flag)
			printf("Yes\n");
		else
			printf("No\n");
	}
	return 0;
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值