#include <cstdio>
#include <cstring>
const int N=100001;
int bleg[N]={0};
int find (int x){
int y=x;
while (y!=bleg[y])
y = bleg[y];
while (x!=bleg[x]){
int px = bleg[x];
bleg[x] = y;
x = px;
}
return y;
}
void Union (int a,int b){
int pa=find (a),pb=find(b);
bleg[pa] = pb;
}
//任意两点有且仅有一天路径,则只有一个根节点。且不存在回路
int main (){
while (1){
int a,b;
// memset (bleg,0,sizeof (bleg));
bool flag=false;
while (scanf ("%d%d",&a,&b)==2 && a && b){
if (a==-1 && b==-1) return 0;
if (bleg[a]==0) bleg[a] = a;
if (bleg[b]==0) bleg[b] = b;
if (find (a)==find(b))
flag = true; //如果存在回路
else
Union (a,b);
}
int ans=0;
for (int i=1;i<=N;i++){
if (find(i)==i) ans++; //根节点
bleg[i]=0;
}
if (ans > 1 || flag) //多余一个根节点 或 存在回路
printf ("No\n");
else
puts ("Yes");
}
return 0;
}
杭电 1727 (并查集)
最新推荐文章于 2020-01-28 11:49:51 发布