迷路レポートを解決するためのHDU 1272リトル希望
問題解決のアイデア:このタイトルは難しくありませんが、地元のピットがあります。リテラルは、等しくない場合は、各入力に2つの数値を比較解くだけ祖先は、それらが等しい場合、リング、即ち、出力NOが存在しなければならない、それを接続する問題を理解します。被験体は、さらに、各ノードは、2つを接続することができることを必要とするので、また、より多くのよりも、それはすなわち2つのルートノードを持つことができない、図林ではありません。その上でここまで考えてください。
#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;
}
}
}