PIPIOJ 1116 这是树吗? 判断是否为一棵树

题目链接:

http://39.106.164.46/problem.php?id=1116

思路:

要保证可以构成一棵树,需要三个条件:
(1)无环
(2)只有一个根结点
(3)一个节点最多只有一个入度
找出可能的根节点,然后判断无环可以用bfs,同时再进行入度的判断。

代码如下:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 1005
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;

int in[MAX],flag[MAX];
int a,b;
vector<int> adj[MAX];

bool judge(){//无环,只有一个根结点,一个节点最多只有一个入度
    int cnt=0,num=0; //cnt为可能的根节点数,num为节点的总数
    queue<int> q;
    for(int i=1;i<MAX;i++){
        if(flag[i]&&in[i]==0){
            cnt++;
            q.push(i);
        }
        if(flag[i]) num++;
    }
    if(cnt!=1) return false;
    while(!q.empty()){
        int top=q.front();
        q.pop();
        for(int i=0;i<adj[top].size();i++){
            int v=adj[top][i];
            in[v]--;
            if(in[v]!=0) return false;
            cnt++;
            q.push(adj[top][i]);
        }
    }
    if(cnt!=num) return false;
    return true;
}

int main(){
    int id=1;
    while(cin>>a>>b){
        if(a==-1&&b==-1) break;
        if(a==0&&b==0){
            cout<<"Case "<<id<<" is a tree."<<endl;
            id++;
        }else{
            memset(in,0,sizeof(in));
			memset(flag,0,sizeof(flag));
			for(int i=0;i<MAX;i++){
                adj[i].clear();
			}
			while(a!=0&&b!=0){
                adj[a].push_back(b);
                in[b]++;
                flag[a]=flag[b]=1;
                cin>>a>>b;
			}
			if(judge()){
                cout<<"Case "<<id<<" is a tree."<<endl;
                id++;
			}else{
			    cout<<"Case "<<id<<" is not a tree."<<endl;
                id++;
			}
        }
    }
    return 0;
}

你可能感兴趣的:(PIPIOJ)