您的位置:首页 > 其它

HDU-1325-Is It A Tree?

2013-04-15 19:03 441 查看
/* 可以用并查集来解决这个问题,给出一些边判断是不是一个棵树, 只需要判断只有一个跟节点并且每个点的度不大于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++);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: