HDU 1272 小希的迷宫 解题报告 并查集

HDU 1272 小希的迷宫 解题报告

解题思路:这题不难,但是有坑的地方。字面理解题意,解题只需要比较每次输入的两个数的祖先,如果不等,将其连接,如果相等,那么必然成环,即输出NO。然而还不止如此,因为题目还要求每两个节点都能连接上,所以图不能是森林,即不能有两个根节点。想到这为止,就可以了。
在这里插入图片描述

#include <stdio.h>
#include<iostream>
#include <algorithm>
#include<string.h>
#pragma warning(disable:4996)
#define mod 1000000007
#define ll unsigned long long
const int N = 100005;
using namespace std;
int father[N], visit[N];
int mx;
int mi;
int flag;
int find(int x)
{
	if (father[x] == x)
		return x;
	return father[x] = find(father[x]);
}
void judge()
{
	int cnt = 0;
	for (int i = mi; i <= mx; i++)
	{
		if (visit[i] && i == find(i))//不能有两个根节点
		{
			cnt++;
			if (cnt > 1)
			{
				flag = 1;
				return;
			}
		}
	}
}
int main()
{
	int a, b;
	for (int i = 1; i < N; i++)
	{
		father[i] = i;
	}
	mi = 1000010;
	while (scanf("%d%d", &a, &b))
	{

		if (a == -1 && b == -1)
		{
			return 0;
		}
		if (a == 0 && b == 0)
		{
			judge();
			if (flag)
			{
				printf("No\n");
			}
			else
			{
				printf("Yes\n");
			}
			for (int i = 1; i < N; i++)
			{
				father[i] = i;
			}
			memset(visit, 0, sizeof(visit));
			flag = 0;
			mx = 0;
			mi = 1000010;
			continue;
		}
		mx = max(mx, max(a, b));
		mi = min(mi, min(a, b));
		visit[a] = 1;
		visit[b] = 1;
		if (flag)
		{
			continue;
		}
		int fa = find(a);
		int fb = find(b);
		if (fa == fb)
		{
			flag = true;
			continue;
		}
		else
		{
			father[fa] = fb;
		}
	}
}

发布了64 篇原创文章 · 获赞 0 · 访问量 1440

猜你喜欢

转载自blog.csdn.net/weixin_45566331/article/details/105041423