题意:

思路:



#include <cstdio>
#include <set>
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int fa[N],in[N];
int m;//边的数量 
bool isTree;
set<int> s;
void init(){
    for(int i = 1;i < N;i++) fa[i] = i,in[i] = 0;
    m = 0;
    isTree = 1;
    s.clear();
}
int find(int x){
    return fa[x] == x ? x : fa[x] = find(fa[x]);
}
bool merge(int x,int y){
    int fx = find(x),fy = find(y);
    if(fx == fy) return 0;
    fa[fx] = fy;
    return 1;
}
void check(){
    if(m != s.size() - 1 && s.size() != 0) isTree = 0;
}
int main(){
    int u,v,cas = 1;
    init();
    while(~scanf("%d%d",&u,&v)){
        if(u < 0 && v < 0) break;
        if(u == 0 && v == 0){
            check();
            if(isTree){
                printf("Case %d is a tree.\n",cas++);
            }else{
                printf("Case %d is not a tree.\n",cas++);
            }
            init();
        }else{
            m++;
            isTree &= merge(u,v);
            if(++in[v] > 1) isTree = false;
            s.insert(u),s.insert(v);
        }
    }
}