POJ 1308

题目大意就是判断是否为一棵树?

成为一棵树的条件是:只有一个根节点、非根节点只有一个入度

这里要注意的是,空树也是树,森林不是树,1 1 0 0 不是树,自己不能指向自己

#include <iostream>
using namespace std;

#define MAX 105

int p[MAX];
bool flag[MAX];

int Find(int a){    //并查集,递归寻找根节点
    return a==p[a]?a:a=Find(p[a]);
}

void Union(int a,int b){  //看是否成环
    int x = Find(a);
    int y = Find(b);
    if(x!=y)    p[y] = x;
}

int main(){
    int x,y,i,first;
    int t=1;
    while(cin>>x>>y){
        if(x == -1 && y == -1)
            break;
        if(x == 0&&y == 0){  //空树也是一棵树
            cout<<"Case "<<t++<<" is a tree."<<endl;
            continue;
        }
        for(i=0;i<MAX;i++){
            p[i] = i;           //初始化
            flag[i] = false;
        }
        flag[x] = flag[y] = true;
        first = x;
        bool tree = true;
        if(x == y)    tree = false;   //自己指向自己,不是一棵树
        else{
            Union(x,y);
        }
        while(cin>>x>>y,x!=0){
            flag[x] = flag[y] = true;
            if(Find(x) == Find(y))  //有共同祖先,x再指向y,就不是一棵树
                tree = false;
            Union(x,y);
        }
        for(i=0;i<MAX;i++){
            if(flag[i]&&Find(i)!=Find(first)){  //森林不是一棵树
                 tree = false;
            }
        }
        if(tree)    cout<<"Case "<<t++<<" is a tree."<<endl;
        else
            cout<<"Case "<<t++<<" is not a tree."<<endl;
    }
    return 0;
}


你可能感兴趣的:(C++,poj)