HDU - 1272
一个简单的并查集应用题
小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)。
由题可见,这是道并查集找环并且单集合的题
所以只要判断父节点是否相同(是否有环),以及祖宗结点是否只有一个(是否为单集合)就可以了
代码附上:
#include<bits/stdc++.h>
using namespace std;
using ll = long long ;
const int N = 100000+10;
int fa[N];
bool flag;
void init()
{
flag=1;
memset(fa,0,sizeof fa);
}
int fd_ys(int k)
{
if(k!=fa[k])
fa[k]=fd_ys(fa[k]);
return fa[k];
}
void to_get_ans()
{
int gra=0,now=0;
for(int i=1; i<N&&flag; ++i)
{
if(fa[i])
now=fd_ys(i);
if(!gra)
gra=now;
if(gra!=now)
flag=0;
}
if(flag==0)
cout<<"No\n";
else
cout<<"Yes\n";
init();
}
void link(int a,int b)
{
int A,B;
if(!fa[a])
A=fa[a]=a;
else
A = fd_ys(a);
if(!fa[b])
B=fa[b]=b;
else
B = fd_ys(b);
if(A==B)
flag=0;
else
fa[A]=B;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int a,b;
init();
while(cin>>a>>b,a+b>=0)
{
if(!a)
to_get_ans();
else
link(a,b);
}
return 0;
}