题目:这里让你判断是不是一棵树。
注意树的条件:
1、只有一个点的入度为0,其他都为1;
2、不能成环!! 比如1 2,2 1这样就成环了,所以不能光看入度。。
#include<iostream>
#include<stdio.h>
using namespace std;
#define maxn 99999
int par[maxn];
int ranks[maxn];
int c[maxn];
bool visit[maxn];
bool flag;
void init()
{
flag=0;
for(int i=1;i<maxn;i++)
{
par[i]=i;
ranks[i]=0;
c[i]=0;
visit[i]=0;
}
}
int finds(int x)
{
if(x==par[x])
return par[x];
else
return par[x]=finds(par[x]);
}
void unions(int x,int y)
{
int root1,root2;
root1=finds(x);
root2=finds(y);
par[root2]=root1;
if(root1==root2)
flag=1;//防止出现12 21这种环!!
}
int main()
{
int x,y,num=0;
while(~scanf("%d%d",&x,&y)&&x>=0&&y>=0)
{
init();
num++;
if(x==0&&y==0)
{
printf("Case %d is a tree.\n",num);
continue;
}
c[y]++;
unions(x,y);
visit[x]=1;visit[y]=1;
int a,b;
while(~scanf("%d%d",&a,&b)&&a+b!=0)
{
c[b]++;
unions(a,b);
visit[a]=1;visit[b]=1;
if(c[b]>1)
flag=1;
}
int coun=0;
for(int i=0;i<maxn;i++)
if(visit[i]==1&&finds(i)==i)
coun++;
if(coun>1)
flag=1;
if(flag==0)
printf("Case %d is a tree.\n",num);
else
printf("Case %d is not a tree.\n",num);
}
return 0;
}