题意:
思路:
#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);
}
}
}