#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 1000;
int father[MAXN];
int height[MAXN];
int inDegree[MAXN];
bool visit[MAXN];
void Initial(){
for(int i = 0; i <= MAXN; i++){
father[i] = i;
height[i] = 0;
inDegree[i] = 0;
visit[i] = false;
}
}
int Find(int x){
if(x != father[x]){
father[x] = Find(father[x]);
}
return father[x];
}
void Union(int x, int y){
x = Find(x);
y = Find(y);
if(x != y){
if(height[x] < height[y]){
father[x] = y;
}else if(height[x] > height[y]){
father[y] = x;
}else{
father[y] = x;
height[x] ++;
}
}
return ;
}
bool IsTree(){
bool flag = true;
int compoent = 0;
int root = 0;
for(int i = 0; i < MAXN; i++){
if(!visit[i]){
continue;
}
if(father[i] == i){
compoent++;
}
if(inDegree[i] == 0){
root ++;
}else if (inDegree[i] > 1){ //入度不满足
flag = false;
}
}
if(compoent != 1 || root != 1){
flag = false;
}
if(compoent == 0 && root == 0){
flag = true;
}
return flag;
}
int main(int argc, char** argv) {
int x, y;
int caseNumber = 0;
Initial();
while(scanf("%d %d", &x, &y) != EOF){
if(x == 1 && y == -1){
break;
}
if(x == 0 && y == 0){
if(IsTree()){
printf("Case %d is a tree", ++caseNumber);
}else{
printf("Case %d is not a tree", ++caseNumber);
}
Initial();
}else{
Union(x, y);
inDegree[y]++;
visit[x] = true;
visit[y] = true;
}
}
return 0;
}
【计算机考研机试指南】第十一章 图论:并查集——Is it a tree_北大
最新推荐文章于 2024-07-14 19:56:17 发布