题解 P2307 【迷宫】
vegetabird · · 题解
大神们都用并查集,蒟蒻只能跑搜索了。。。
不过判断是否连通,是否有环似乎搜索也够了
对于搜到的每一个点,遍历与其相邻的每一个点,如果该点不是当前点的父节点且已经被搜过,则这个图不是树
如果该点未被搜索过,则继续搜下去
搜索后看一看是不是所有点都被搜到了
如果没有,则不是树
CODE:
#include<cstdio>
#include<cctype>
#include<cstring>
#include<utility>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
#include<set>
using namespace std;
int n,m;
int a[500010],b[500010],fst[100010],nxt[500010];
bool vis[100010];
bool exist[100010];
int num[100010];
int q[100010],head,tail;
int x,y;
bool avai;
void dfs(int u,int pre){
vis[u]=true;
for(int k=fst[u];k;k=nxt[k]){
if(b[k]==pre)continue;
if(vis[b[k]]){
avai=false;
return;
}
dfs(b[k],u);
}
}
int main(){
int i,j,k;
while(x>=0&&y>=0){
scanf("%d%d",&x,&y);
if(x<0&&y<0)return 0;
n=m=0;
while(x>0&&y>0){
m++;
a[m*2-1]=x,b[m*2-1]=y;
a[m*2]=y,b[m*2]=x;
if(!exist[x]){
num[++n]=x;
fst[x]=0;
vis[x]=false;
exist[x]=true;
}
if(!exist[y]){
num[++n]=y;
fst[y]=0;
vis[y]=false;
exist[y]=true;
}
nxt[m*2-1]=fst[x];
fst[x]=m*2-1;
nxt[m*2]=fst[y];
fst[y]=m*2;
scanf("%d%d",&x,&y);
}
avai=true;
dfs(num[1],0);
for(i=1;i<=n;i++){
if(!vis[num[i]]){
avai=false;
break;
}
}
if(avai){
printf("1\n");
}else{
printf("0\n");
}
for(i=1;i<=n;i++){
exist[num[i]]=false;
}
}
}