sicily1034 Forest

模拟一个森林,找森林的宽度和深度

#include 
using namespace std;
#include 
#include 

int main(){
    int n,m,a,b;
    while (cin >> n>> m && n) {
        vector node[101]; // 找儿子 
        bool visited[101];     // 找爸爸 (是否有爸爸)
        memset(visited, false, sizeof(visited));
        bool twoFather = false, haveRoot = true;
        for(int i = 0; i < m; ++i) {
            cin >> a>> b;
            node[a-1].push_back(b-1); // a的儿子有b 
            if (visited[b-1]) twoFather = true;
            else visited[b-1] = true; 
        }
        vector next, now;
        for (int i = 0; i < n; ++i) if (!visited[i]) now.push_back(i); 
        if (now.empty() || twoFather){
            cout << "INVALID\n"; continue;
        } 
        int depth = -1, width = 0, time = 0;
        while(!now.empty() && time <= n+1) {
            depth++;
            if (now.size() > width) width = now.size();
            for (int i = 0; i < now.size(); ++i) {
                time++;
                for (int j = 0; j < node[now[i]].size(); ++j) next.push_back(node[now[i]][j]); 
            }
            now = next;
            next.clear();
        } 
        if (time == n){
            cout << depth<< " "<< width<< endl;
        } else {
            cout << "INVALID\n";
        }
    }   
} 

你可能感兴趣的:(sicily1034 Forest)