迷宫,判断给出的迷宫是否有回路,即判断是否成环。
方法:并查集 或者深搜宽搜
比较坑的是要注意只有0 0的时候要输出yes,只有1 1 0 0这样的数据时要输出no。
还有,我的Union函数里fa[root_x] = root_y这样写会暴栈,改成fa[root_x] = root_y就能过,这是怎么回事。。。。
# include <cstdio>
# include <cstring>
# include <iostream>
using namespace std;
const int MAXN = 100010 ;
int fa[MAXN] = {0} ;
bool vis[MAXN] = {0} ;
int find_root(int x) {
return (x == fa[x])? x : fa[x] = find_root(fa[x]) ;
}
bool Union(int x , int y) {
int root_x , root_y ;
root_x = find_root(x) ;
root_y = find_root(y) ;
if (root_x == root_y) return 1 ;
else {
fa[root_y] = root_x ;
vis[root_y] = 0 ;
return 0 ;
}
}
int main() {
//freopen("in.txt" , "r" , stdin) ;
int w1 , w2 ;
while (cin >> w1 >> w2) {
if (w1 == -1 && w2 == -1) break ;
if (!w1 && !w2) {cout << "Yes" <<endl ; continue ;}
for (int i = 1 ; i <= MAXN ; i ++) {
fa[i] = i ;
}
memset(vis , 0 , sizeof(vis)) ;
int flag = -1 ;
vis[w1] = 1 ; vis[w2] = 1 ;
if (Union(w1 , w2)) flag ++ ;
while (cin >> w1 >> w2 , w1 || w2) {
vis[w1] = 1 ; vis[w2] = 1 ;
if (Union(w1 , w2)) flag ++ ;
}
for (int i = 1 ; i <= MAXN ; i ++) {
if (vis[i]) flag ++ ;
}
if (flag) cout << "No" << endl ;
else cout << "Yes" << endl ;
}
return 0;
}