小希的迷宫
链接 HDU - 1272
就
是
一
个
并
查
集
基
础
模
板
,
但
是
这
个
题
有
两
个
坑
就是一个并查集基础模板,但是这个题有两个坑
就是一个并查集基础模板,但是这个题有两个坑
思
路
就
是
判
断
每
个
点
在
路
线
上
是
否
重
复
包
括
过
,
这
个
用
最
基
础
的
并
查
集
就
行
思路就是判断每个点在路线上是否重复包括过,这个用最基础的并查集就行
思路就是判断每个点在路线上是否重复包括过,这个用最基础的并查集就行
第
一
个
坑
,
是
我
们
要
确
保
整
张
地
图
连
通
,
也
就
是
他
们
的
祖
先
都
是
一
个
第一个坑,是我们要确保整张地图连通,也就是他们的祖先都是一个
第一个坑,是我们要确保整张地图连通,也就是他们的祖先都是一个
第
二
个
坑
就
是
直
接
输
入
0
,
0
相
当
于
空
图
我
们
要
输
出
Y
e
s
第二个坑就是直接输入0,0相当于空图我们要输出Yes
第二个坑就是直接输入0,0相当于空图我们要输出Yes
代 码 代码 代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
const int N = 1e5 + 10;
int p[N];
int find(int x)
{
if(x != p[x])
{
p[x] = find(p[x]);
}
return p[x];
}
pair<int,int> cnt[N];
int main()
{
int a, b;
while(cin >> a >> b, ~a)
{
if(!a)
{
puts("Yes");
continue;
}
int idx = 0;
cnt[idx++] = {a, b};
bool fg = false;
bool s = false;
p[b] = a;
while(cin >> a >> b, a)
{
cnt[idx++] = {a, b};
}
for(int i = 1; i < N; i ++)
{
p[i] = i;
}
for(int i = 0; i < idx; i ++)
{
int x = cnt[i].first;
int y = cnt[i].second;
int px = find(x);
int py = find(y);
if(px == py)
{
fg= true;
break;
}
else
{
p[py] = px;
}
}
int r = find(cnt[0].first);
for(int i = 0; i < idx; i ++)
{
int x = cnt[i].first;
int y = cnt[i].second;
int px = find(x);
int py = find(y);
if(px != r || py != r)
{
s= true;
break;
}
}
if(!s && !fg)
{
puts("Yes");
}
else
{
puts("No");
}
}
return 0;
}