并查集应用——小希的迷宫
方法一:
对于输入的a、b,先判断是否在同一集合(即fa == fb),如果在,则不符合。
最后要判断:是否只有一个连通图。
我的代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn = 1e5 + 5;
ll f[maxn], vis[maxn];
ll a, b, res;
int findFather(int x){
if(x == f[x]) { return x; }
else return f[x] = findFather(f[x]);
}
void Union(int a, int b){
int fa = findFather(a);
int fb = findFather(b);
if(fa != fb){
f[fa] = fb;
}
}
void init(){
for(int i = 1; i <= maxn; i++){
f[i] = i, vis[i] = 0;
}
res = 0;
//flag = 0;
}
int main(){
int flag = 0;
while(1){
init();
ll fa, fb, father;
ll num = 0;
while(cin >> a >> b){
num++;
if(a == 0 && b == 0) break;
if(a == -1 && b == -1){flag = 1;break;}
fa = findFather(a);
fb = findFather(b);
vis[a] = 1, vis[b] = 1;
if(fa == fb){res = 1;}
else f[fa] = fb;
}
if(flag) break;
if(num == 1){cout << "Yes" << endl; }
else if(res) { cout << "No" << endl; }
else{//是否连通图
ll cnt = 0;
for(ll i = 1; i <=maxn; i++){
if(f[i] == i && vis[i]) {
cnt++;
}
}
if(cnt == 1){cout << "Yes" << endl;}
else cout << "No" << endl;
}
}
}
/*
6 8 5 3 5 2 6 4 5 6 0 0
8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0
3 8 6 8 6 4 5 3 5 6 5 2 0 0
-1 -1
*/
wa点:
0 0 时输出Yes;
判断是否连通图,可以用vis[]和f[i] = i来判定。但注意如果只有一个连通图时,cnt = 1而不是0.
方法二:
判断是否一棵树。
树的定义:
1、连通图
2、点数=边数+1
如果只有第二个条件,例子:1 2 3 4 4 3 0 0
本文介绍使用并查集解决迷宫问题的方法。通过两种方式判断迷宫是否只有一个连通图,包括检查所有节点是否属于同一集合及验证点数与边数的关系。代码示例清晰展示了解决方案。
1061

被折叠的 条评论
为什么被折叠?



