题解:
跟小希的迷宫差不多,但是,但是!这是个有向图!有向图!有向图!重要的事情说三遍,md把他当无向图做,错了一早上,然后是输入两个负数就跳出,不是两个-1。然后怎么做呢?只要加个判断就好了,判断入度为1的点是否有n-1个(n是总共输入的点)。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN=1e5+7;
int f[MAXN];
int ru[MAXN];
bool vis[MAXN];
void init()
{
memset(vis,false,sizeof(vis));
memset(ru,0,sizeof(ru));
for(int i=0;i<=1e5;i++)
f[i]=i;
}
int find(int p)
{
while(p!=f[p])
{
f[p]=f[f[p]];
p=f[p];
}
return p;
}
bool Union(int p,int q)
{
int P=find(p);
int Q=find(q);
if(P==Q)
return true;
else
{
f[Q]=P;
}
return false;
}
int main()
{
int k=1;
while(1)
{
int a,b,MAX=0;
init();
bool mark=false,ans=false;
while(~scanf("%d%d",&a,&b))
{
if(a<0&&b<0)
{
mark=true;
break;
}
MAX=max(max(MAX,a),b);
vis[a]=true;
vis[b]=true;
ru[b]=true;
if(a==0&&b==0)
break;
if(Union(a,b))
ans=true;
}
int sum=0,count=0,num=0;
for(int i=1;i<=MAX;i++){
if(vis[i]){
num++;
if(ru[i]==1)
count++;
if(f[i]==i)
sum++;
}
}
// printf("%d %d\n",count,num);
if(mark)
break;
if(ans||sum>1||count<num-1)
printf("Case %d is not a tree.\n",k++);
else
printf("Case %d is a tree.\n",k++);
}
}