hdu 1272 小希的迷宫

该程序实现了一个并查集的数据结构,用于检测输入的边是否构成环路。通过非递归的路径压缩方法找到节点的父节点,并在连接节点时检查是否形成环。在读取边的输入过程中,如果遇到特定信号则输出当前是否存在环,并重置数据结构以准备处理下一次输入。
摘要由CSDN通过智能技术生成

题目有图片就直接给链接了

注意:并不是所有的节点都在迷宫中出现了,我们只需要保证出现的节点构成了一个并查集就可以了。
判断是否有环的标志:每次给出的边(a–b)一点不是同一个父亲,否则则构成了环。

#include<bits/stdc++.h>
using namespace std;

const int maxn = 100007;
int Max;
int fa[maxn];
bool v[maxn];

// int find(int x)
// {
// 	if(x==fa[x])
// 		return x;
// 	else
// 		return fa[x] = find(fa[x]);//压缩路径
// }
int find(int x)//压缩路径的非递归写法,数量量较大时才用
{
	int r = x;//储存临时变量
	while(fa[r]!=r)r = fa[r];//找到父节点
	int i = x, j;
	while(i!=r)
	{
		j = fa[i];//储存临时变量
		fa[i] = r;//把路径上的指向父节点
		i = j;
	}
	return r;//返回父节点
}
int main()
{
	freopen("11.txt", "r", stdin);
	int  x, y;
	bool flag = true;
	for (int i = 0;i<=maxn;i++)
		fa[i] = i;

	while (scanf("%d%d", &x, &y)!=EOF)
	{
		if (x == -1 && y == -1)
			break;
		if (x == 0 && y == 0) //需要输出并更新
		{
			int cnt = 0;
			for (int i = 1;i<=Max;i++)
			   if(fa[i]==i&&v[i])
				   cnt++;//只能有一个爹
		 

			if (flag&&cnt<=1)
				cout << "Yes" << endl;
			else
				cout << "No" << endl;

			//初始化数据为下一次作准备	
			for (int i = 0;i<=maxn;i++)
				fa[i] = i;
			memset(v, 0, sizeof(v));
			flag = 1;
		}
		else
		{
			int a = find(x), b = find(y);
			Max = max(a, max(Max, b));
			if(a==b) flag = 0;
			else fa[b] = a , v[x]=v[y]=1 ;//标记访问节点,并且将  a,b 相连。
		}
	}

	return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值