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;
}
}
}