| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 24299 | Accepted: 8339 |
Description

Input
Output
Sample Input
6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1
Sample Output
Case 1 is a tree. Case 2 is a tree. Case 3 is not a tree.
//判断是不是树
#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#define N 100009
using namespace std;
int a,b;
int fa[N];
int vis[N];
int findfa(int x)
{
if(x!=fa[x])
fa[x]=findfa(fa[x]);
return fa[x];
}
int main()
{
int ca=1;
while(~scanf("%d %d",&a,&b))
{
if(a==-1 && b==-1) break;
if(a==0 && b==0)
{
printf("Case %d is a tree.\n",ca++);
continue;
}
int fff=a;//任意记录一个结点
for(int i=0;i<=N;i++)
{
fa[i]=i;vis[i]=0;
}
int flag=0;
while(a||b)
{
if(a==0 && b==0)
break;
vis[a]=1;vis[b]=1;
int aa=findfa(a);
int bb=findfa(b);
if(aa==bb)//如果重复指向,表明存在环,不是树
flag=1;
else
{
fa[bb]=aa;
}
scanf("%d %d",&a,&b);
}
int num=0;
// for(int i=min;i<=max;i++)
// cout<<"fa["<<i<<"]="<<fa[i]<<endl;
if(flag)
printf("Case %d is not a tree.\n",ca++);
else
{
for(int i=0;i<=105;i++)
{
if(vis[i] && findfa(i)!=findfa(fff))//判断是不是只有一个树根
{
flag=1;
break;
}
}
if(flag==0)
printf("Case %d is a tree.\n",ca++);
else
printf("Case %d is not a tree.\n",ca++);
}
}
return 0;
}
//WH环境日
原文:http://blog.csdn.net/wust_zjx/article/details/46366433