//土尔逊Torson 编写于2023/06/20
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN12801 = 10000;
int father12801[MAXN12801]; //父亲结点
int height12801[MAXN12801]; //结点高度
int inDegree12801[MAXN12801];//入度
bool visit12801[MAXN12801]; //标记
void Initial12801() { //初始化
for (int i = 0; i < MAXN12801; i++) {
father12801[i] = i;
height12801[i] = 0;
inDegree12801[i] = 0;
visit12801[i] = false;
}
}
int Find12801(int x) { //查找根结点
if (x != father12801[x]) {
father12801[x] = Find12801(father12801[x]);
}
return father12801[x];
}
void Union12801(int x, int y) {//合并集合
x = Find12801(x);
y = Find12801(y);
if (x != y) {
if (height12801[x] < height12801[y]) {
father12801[x] = y;
}
else if (height12801[y] < height12801[x]) {
father12801[y] = x;
}
else {
father12801[y] = x;
height12801[x]++;
}
}
return;
}
bool IsTree12801() {
bool flag = true;
int component = 0; //连通分量数目
int root = 0; //根结点数目
for (int i = 0; i < MAXN12801; ++i) {
if (!visit12801[i]) {
continue;
}
if (father12801[i] == i) {
component++;
}
if (inDegree12801[i] == 0) {
root++;
}
else if (inDegree12801[i] > 1) { //入度不满足要求
flag = false;
}
}
if (component != 1 || root != 1) { //不符合树定义
flag = false;
}
if (component == 0 && root == 0) {
flag = true;
}
return flag;
}
int main() {
int x, y;
int caseNumber = 0;
Initial12801();
while (scanf("%d%d", &x, &y) != EOF) {
if (x == -1 && y == -1) {
break;
}
if (x == 0 && y == 0) {
if (IsTree12801()) {
printf("Case %d is a tree.\n", ++caseNumber);
}
else {
printf("Case %d is not a tree.\n", ++caseNumber);
}
Initial12801();
}
else {
Union12801(x, y);
inDegree12801[y]++;
visit12801[x] = true;
visit12801[y] = true;
}
}
system("pause");
return EXIT_SUCCESS;
}
// 64 位输出请用 printf("%lld")