思路:
- 很容易想到是并查集,若新路的两端已经联通,则成环(不符合要求)。
- 但是有坑:首先小希要求 “任意两个房间都有且仅有一条路”,即全图是强连通的。若树根有两个或两个以上则不符合要求。
- 若直接输入 “0 0”,说明迷宫没有房间,符合要求。
- 注意编号不一定顺序,因此要加入 app[maxn]。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1e5 + 5;
bool ans;
bool app[maxn];
int par[maxn];
void INIT(){
ans = true;
memset(par , -1 , sizeof(par));
memset(app , 0 , sizeof(app));
return ;
}
int FIND(int i){
return par[i] == -1 ? i : par[i] = FIND(par[i]) ;
}
void UNION(int l,int r,int parl,int parr){
par[parr] = parl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int l,r;
while(cin>>l>>r && l != -1){
INIT();
while(true){
if(!l)
break;
app[l] = app[r] = true;
int parl = FIND(l);
int parr = FIND(r);
if(parl == parr)
ans = false;
else
UNION(l , r , parl , parr);
cin>>l>>r;
}
if(ans){
int cnt = 0;
for(int i=0;i<maxn;i++)
if(app[i] && FIND(i) == i)
++cnt;
if(cnt > 1)
ans = false;
}
if(ans)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}