#include<iostream>#include<cstring>#include<cstdio>usingnamespace std;constint N =10010;int a, b, cnt, idx;int s[N], d[N];bool flag =true, st[N];voidinit(){
cnt =0;
flag =true;memset(d,0,sizeof d);memset(st,false,sizeof st);for(int i =0; i < N; i ++) s[i]= i;}intfind(int x){if(x != s[x]) s[x]=find(s[x]);return s[x];}intmain(){init();while(cin >> a >> b,!(a ==-1&& b ==-1)){if(!a &&!b){if(flag && cnt){int k =0;for(int i =0; i < N; i ++)if(st[i]&&!d[i]) k ++;if(k !=1) flag =false;}if(flag)printf("Case %d is a tree.\n",++ idx);elseprintf("Case %d is not a tree.\n",++ idx);init();continue;}
cnt ++;
st[a]= st[b]=true;
d[b]++;if(d[b]>1) flag =false;int root1 =find(a), root2 =find(b);if(root1 != root2) s[root2]= root1;else flag =false;}return0;}
POJ - 1308 Is It A Tree?并查集用于判断是否存在环入度数组用于判断下述条件:(1)除了根节点外,每个节点都有且仅有一条指向它的边。(2)从根节点到每个其他节点都有一条唯一的有向边序列。#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int N = 10010;int a, b, cnt, idx;int s[