并查集
不过有一些需要注意的地方:
如果有两个点之间早已连通,则直接标记ok为0,如果ok==1,在最后还要判断node-1是否等于edge,因为迷宫必须是连通的,而ok 等于1时,说明每两点之间至多有一条路径,这时node-1等于edge就说明连通了。
如果输入只有0 0,直接输出yes,这里有点小坑
#include<cstdio>
#include<cstring>
using namespace std;
const int MAX=100005;
int last[MAX];
char have[MAX];
void make(){
for(int i=1;i<=MAX;i++){
last[i]=i;
have[i]=0;
}
}
int find(int x){
int p=x,t;
while(p!=last[p])p=last[p];
while(x!=p){
t=last[x],last[x]=p,x=t;
}
return p;
}
void un(int a,int b){
last[a]=b;
}
int main(){
int a,b,aa,bb,ok=1,edge=0,all=0;
make();
while(1)
{
scanf("%d %d",&a,&b);
all++;
if(a==b&&a==0){
if(all==1){
printf("Yes\n");
continue;
}
if(ok){
int node=0;
for(int i=1;i<=MAX;i++)
if(have[i])
node++;
if(node-1!=edge)
ok=0;
}
if(ok)
printf("Yes\n");
else
printf("No\n");
ok=1,edge=0,all=0;
make();
continue;
}
if(a==-1&&b==-1)
break;
if(ok){
have[a]=1,have[b]=1;
aa=find(a),bb=find(b);
if(aa!=bb){
un(aa,bb);
edge++;
}
else
ok=0;
}
}
return 0;
}