题目大意:
emmmmmm
解题思路:
抓住迷宫的条件:任意两个房间有且只有一条路。(这里要注意:输入为 0 0 的时候,也要输出yes )。这样的话只要在输入数据的时候同时union,当proot=qroot时,return -1,表示有两条路了,其他就return 1。另外每次都插入set容器中,算结点数。然后所有输入完毕的时候,判断一下根节点的size是不是和节点数量一样,不一样说明不是任意的两个房间之间都有路,也是错的。
参考代码:
#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
using namespace std;
const int INF=0x3f3f3f3f;
const int SIZE=1e5+10;
set<int> st; ///这个是为了两两查找的时候方便一点
int id[SIZE];
int sz[SIZE];
int count;
int find(int x) ///找跟根结点
{
while(x!=id[x])
{
id[x]=id[id[x]];
x=id[x];
}
return x;
}
int un(int p,int q)
{
int pr=find(p);
int qr=find(q);
if(pr==qr) return -1;
if(sz[pr]<=sz[qr])
{
sz[qr]+=sz[pr];id[pr]=qr;
}
else
{
sz[pr]+=sz[qr];id[qr]=pr;
}
}
void clear()
{
for(int i=1;i<=SIZE;i++)
{
id[i]=i;sz[i]=1;
}
st.clear();
}
int main()
{
int p,q;
int temp,flag;
while(cin>>p>>q)
{
flag=0;
clear();
if(p==-1&&q==-1) break;
if(p==0&&q==0) {cout<<"Yes\n";continue;} ///特判0 0的情况
st.insert(p);
st.insert(q);
un(p,q);
int mark=p;
while(cin>>p>>q)
{
if(p==0&&q==0) break;
temp=un(p,q);
if(temp==-1) flag=1; ///重复连通了 = =
st.insert(p);st.insert(q);
}
count=st.size();
if(sz[find(mark)]<count) flag=1; ///有没有互通
if(flag==1) cout<<"No\n";
else cout<<"Yes\n";
}
return 0;
}