您的位置:首页 > 其它

HDU 1325&&POJ 1308 Is It A Tree? (并差集)

2015-02-06 16:52 393 查看
就是判断给出的是不是一棵树....

比起小希的迷宫那个题目,多出来一个入度最多为1...大于1就不是树了...

HDU的版本是输入两个负数结束而POJ就是和样例一样输入俩-1 结束..贴出来杭电的版本:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
int f[200000],m[200000];
void inti()
{
for(int i=0;i<=100000;i++)
f[i]=i;
}
int find(int x)
{
if(x!=f[x])
return find(f[x]);
return x;
}
int main()
{
int x,y,num[200000];
int cas=1;
while(cin>>x>>y,x>=0||y>=0)
{
inti();
memset(m,0,sizeof(m));
memset(num,0,sizeof(num));
int flag=1;
if(x==0&&y==0)//空树也是树
{
printf("Case %d is a tree.\n",cas);
cas++;
continue;
}
int p=99999999,q=-1;
while(x!=0||y!=0)
{
if(x<p) p=x;
if(x>q) q=x;
if(y<p) p=y;
if(y>q) q=y;
m[x]=1,m[y]=1;
num[y]++;
int dx=find(x);
int dy=find(y);
if(dx==dy)
flag=0;
else
f[dy]=dx;
cin>>x>>y;
}
if(flag==0)//有环就不是树
{
printf("Case %d is not a tree.\n",cas);
cas++;
continue;
}
int ans=0;
for(int i=p;i<=q;i++)//多个根就不是树
{
if(f[i]==i&&m[i]==1)
ans++;
}
for(int i=p;i<=q;i++)//入度大于1就不是树
{
if(num[i]>1&&m[i]==1)
ans=0;
}
if(ans==1)
printf("Case %d is a tree.\n",cas);
else
printf("Case %d is not a tree.\n",cas);
cas++;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: