#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
#define MAX 1000
int map[MAX][MAX];
int number[MAX];//这一行的-1的个数
int HasNumber[MAX];//这一行是不是有数
int check()
{
int i,j;int flag=0;
for(i=0;i<MAX;i++)
{
//如果说这一行全是0表明没有数据
int quanling=1;
for(j=0;j<MAX;j++)
{
if(map[i][j]!=0)
{
quanling=0;
}
}
if(quanling)
{
HasNumber[i]=0;
}
//如果这一行不是全零才需要处理
if(!quanling)
{
for(j=0;j<MAX;j++)
{
if(map[i][j]==-1)
number[i]++;
}
}
}
//开始判断是不是树,第一,只有一个有数的行没有-1
// 第二,每一有数的行只有一个-1
//第一个条件
int N1=0;//没有-1的行
for(i=0;i<MAX;i++)
{
if(HasNumber[i]&&number[i]==0)
{
N1++;HasNumber[i]=0;//我门把没有-1的行认为是没有数,这样下面好处理
}
}
if(N1!=1)
{
return 0;
}
//第二个条件
for(i=0;i<MAX;i++)
{
if(!HasNumber[i])
{
continue;
}
if(number[i]==1)
{
continue;
}
return 0;
}
return 1;
}
int main()
{
//freopen("input.txt","in",stdin);
int a,b;int i,j;int casen=0;
while(scanf("%d%d",&a,&b))
{
if(a<0&&b<0)
{
return 0;
}
casen++;
//如果第一组输入就是结束
if(a==0&&b==0)
{
printf("Case %d is not a tree.\n",casen);
}
//初始化
for(i=0;i<MAX;i++)
{
HasNumber[i]=1;
number[i]=0;
for(j=0;j<MAX;j++)
{
map[i][j]=0;
}
}
map[a][b]=1;map[b][a]=-1;
while(scanf("%d%d",&a,&b))
{
//如果结束
if(a==0&&b==0)
break;
map[a][b]=1;map[b][a]=-1;
}
//开始处理。
if(check())
{
printf("Case %d is a tree.\n",casen);
}
else
{
printf("Case %d is not a tree.\n",casen);
}
}
return 0;
}
/*
1 while(scanf("%d%d",&a,&b)) 这样写换行也不怕。
*/
hdoj 1325是不是树
最新推荐文章于 2020-12-24 16:33:28 发布