這個題用並查集判斷有沒有森林就行了,注意一些細節的特特判,代碼寫的並不優美,剛開始思路有點亂,導致寫了很多囉嗦的東西,然後就懶得精簡了,-_-|||
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int fa[500000];
int in[500000];
bool flag = 0;
bool vis[5000000];
int find(int x)
{
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
int main()
{
int x,y;int tot = 1;
while(cin >>x>>y)
{
int a,b;
if(x == -1 && y == -1)
break;
else
{
memset(in,0,sizeof(in));
memset(vis,0,sizeof(vis));
memset(fa,0,sizeof(fa));
if(x == 0 && y == 0)
{
printf("Case %d is a tree.\n",tot++);
continue;
}
fa[y] = x;
in[y] ++;
vis[y] = 1;
vis[x] = 1;
while(cin>>a>>b)
{
flag = 0;
int x;
int ans = 0;
if(a == 0 && b == 0)
{
for(int i = 1; i < 10000; i ++)
{
if(in[i] > 1)
{
flag = 1;
}
if(in[i] == 0 && vis[i])
{
x = i;
ans ++;
}
}
if(ans > 1 || ans == 0)
flag = 1;
else
for(int i = 1; i < 1000 ; i ++)
{
if(find(i) != find(x) && vis[i])
{
flag = 1;
}
}
if(flag)
printf("Case %d is not a tree.\n",tot++);
else
printf("Case %d is a tree.\n",tot++);
memset(in,0,sizeof(in));
memset(vis,0,sizeof(vis));
memset(fa,0,sizeof(fa));
break;
}
fa[b] = a;
in[b]++;
vis[b] = 1;
vis[a] = 1;
if(a == b)
flag = 1;
}
}
}
return 0;
}