du[]数组 记录每个点的入度。
最后扫一下所有图上的点,如果只有一个点的入度为0,并且其他点的入度不大于2(就是都等于1),则此图是一个树
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int du[100000];
int vis[100000];
int main()
{
int i,j,k;
int n,m;
int max=0;
int ans=0;
memset(vis,0,sizeof(vis));
memset(du,0,sizeof(du));
while(scanf("%d%d",&n,&m)){
if(n<0 && m<0) break;
if(n==0 && m==0){
ans++;
int t=0,flag=0;
for(i=1;i<=max;i++)
if(vis[i]==1)
if(du[i]==0)
t++;
else if(du[i]!=1)
flag=1;
if(flag==0 && t==1)
printf("Case %d is a tree.\n",ans);
else
printf("Case %d is not a tree.\n",ans);
memset(vis,0,sizeof(vis));
memset(du,0,sizeof(du));
max=0;
continue;
}
if(m>max) max=m;
if(n>max) max=n;
vis[n]=1;
vis[m]=1;
du[m]++;
}
}