成迷宫条件:不成环,只有一个父节点(没有孤立的点)
#include<iostream>
using namespace std;
int pre[100001];
bool t[100001],flag; //t 用于标记独立块的根结点,flag标记成环
int max1;
void init()
{
max1 = 0;
flag = false;
memset(t,0,sizeof(t));
for (int i = 1; i <= 100000; i++)
pre[i]=i;
}
int find(int x)
{
int r = x;
while (r!=pre[r])
r = pre[r];
return r;
}
void join(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx!=fy)
pre[fx ]=fy;
else flag = true; //成环
}
void judge()
{
int roots = 0;
for (int i = 1; i <= 100000; i++)
if(t[i])
if (i == pre[i])
roots++; //判断几个单独的,未联通的点
if(roots>1 || flag) cout<<"No\n";
else cout<<"Yes\n";
}
int main()
{
int n,m,q;
init();
while (cin>>n>>m)
{
t[n]=t[m]=1; //输入过的点都标记
if(m==-1&&n==-1)break;
if(m==0&&n==0)
{
judge();
init();
q = 0;
continue;
}
join(n,m);
}
return 0;
}