/* 可以用并查集来解决这个问题,给出一些边判断是不是一个棵树, 只需要判断只有一个跟节点并且每个点的度不大于1就行、
这个题刚开始RE了几次 一直没找到原因,最后才发现 只要2个数都小于0就终止,我以为是-1,-1 结果RE
*/
#include<cstdio>
#include<cstring>#define M 100010
int p[M],vis[M],deg[M];
int init()
{
for(int i = 0; i <= M; i++)
p[i] = i;
memset(vis,0,sizeof(vis));
memset(deg,0,sizeof(deg));
}
int find(int x)
{
return x==p[x]?x:p[x]=find(p[x]);
}
int Union(int x,int y)
{
vis[x]=vis[y]=1;
int px=find(x);
int py=find(y);
if(px!=py)
{
p[py] = px;
deg[y]++;
}
}
int main()
{
int a,b,kc=1;
while(scanf("%d%d",&a,&b)==2)
{
if(a<0&&b<0) break;
int l=1<<30,r=-1;
if(l>a) l = a;
if(l>b) l = b;
if(r<a) r = a;
if(r<b) r = b;
init();
Union(a,b);
while(1)
{
scanf("%d%d",&a,&b);
if(!a&&!b) break;
Union(a,b);
if(l>a) l = a;
if(l>b) l = b;
if(r<a) r = a;
if(r<b) r = b;
}
int count=0;
for(int i = l; i <= r; i++)
if((p[i]==i&&vis[i])||deg[i]>1)
count++;
if(count!=1)
printf("Case %d is not a tree.\n",kc++);
else printf("Case %d is a tree.\n",kc++);
}
}

本文介绍了一种利用并查集算法判断给定边集合是否构成一棵树的方法。通过维护节点间的连接关系,并确保最终只有一个根节点且各点度不超过1,实现对树结构的有效验证。
875

被折叠的 条评论
为什么被折叠?



