就是判断给出的是不是一棵树....
比起小希的迷宫那个题目,多出来一个入度最多为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;
}