PAT甲级 1004 Counting Leaves (30)

//刚开始想着不用dfs 直接计算每个节点所在的层数 后来发现这个方法有两个点过不去;因为在输入不是按照层序输入的时候这个方法行不通…… 后来用一个简单的dfs标注层数就过了……
#include <iostream>
using namespace std;
typedef struct{
    int child_num;
    int level;
    int child[100];
} Node;
Node tree[101];

void dfs(Node* head){
    int count = head->child_num;
    if (count == 0) {
        return;
    }
    for (int i=0; i<count; i++) {
        tree[head->child[i]].level = head->level+1;
        dfs(&tree[head->child[i]]);
    }
}
int main(){
    int n,m;
    cin>>n>>m;
    //initialize
    for(int i=0;i<101;i++){
        tree[i].child_num=0;
        tree[i].level=-1;
        for (int j=0; j<100; j++) {
            tree[i].child[j]=0;
        }
    }
    int max_level = -1;
    tree[1].level=0;
    tree[1].child_num=0;
    if (m==0) {
        cout<<1;
        return 0;
    }
    //read input
    for (int i=0;i<m;i++){
        int id,child_num;
        cin>>id>>child_num;
        tree[id].child_num = child_num;

        for(int j=0;j<child_num;j++){
            int c_id;
            cin>>c_id;
            tree[id].child[j]=c_id;
        }
    }
    //calculate the level of each node
    dfs(&tree[1]);

    int res[101]={0};
    for(int i=0;i<=100;i++){
        if(tree[i].child_num==0&&tree[i].level!=-1){//node without children
            res[tree[i].level]++;
            max_level = max_level<tree[i].level?tree[i].level:max_level;//renew the max level
        }
    }
    //output
    for(int i=0;i<=max_level;i++){
        if (i!=max_level) {
            cout<<res[i]<<" ";
        }else cout<<res[i];
        
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ken_for_learning/article/details/78357468