原题链接:
题目大意:
正如题目名字一样,判断是否一棵树。
判断两个条件:
1.是否有结点有两个父结点
2.是否是森林
思路:
1.并查集一样存父结点,在存时判断是否已有父结点。
2.判断是否是森林:找到所有根结点
代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAXN=100000+10;
int fa[MAXN];
bool boss;
int main()
{
int kase=1,u,v;
int MAX;
while(scanf("%d%d",&u,&v)!=EOF&&u>=0&&v>=0)
{
memset(fa,-1,sizeof(fa));//初始化为-1,有该结点则重新赋值为0,用处:找根结点
boss=true;
MAX=0;//存最大结点的数值,也可遍历到MAXN
do
{
if(!boss)continue;
if(fa[u]==-1)
fa[u]=0;
if(fa[v]==0||fa[v]==-1)
{
if(MAX<(u>v?u:v))MAX=(u>v?u:v);
fa[v]=u;
}else boss=false;//有两个父结点
}while(scanf("%d%d",&u,&v)!=EOF&&u>0&&v>0);
if(boss)
{
int sum=0;
for(int i=1;i<=MAX;i++)
{
if(fa[i]==0)
sum++;
if(sum>1)//森林
{
boss=false;
break;
}
}
}
if(boss)
printf("Case %d is a tree.\n",kase++);
else printf("Case %d is not a tree.\n",kase++);
}
return 0;
}