PAT甲级-1094 The Largest Generation

题目

题目大意

给定一棵树。n是总结点数,m是父节点的个数,接下来m行,每行给出父节点所对应的子节点的数目和子节点。要求输出各层的最大节点数,和有最大节点的层。有最大节点的层只有一个。

思路

可以用dfs,也可用bfs,这里我用的是bfs。用一个l数组存放各层的节点数目,用二维数组存储树。bfs中的队列的节点需要和层数绑定,子节点的层数 = 父节点的层数 + 1。结束bfs后,for循环找到l数组中的最大节点数,和其所对应的层数。

代码

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int n, m;
vector<vector<int>> v;
int maxn = 0, maxl = 0;
vector<int> l;  // 每层的个数

struct node{
    int id;
    int level;
};  // 队列的数据结构

void bfs(node root){
    queue<node> q;
    q.push(root);
    while (!q.empty()){
        node now = q.front();
        l[now.level]++;
        q.pop();
        for (int i = 0; i < (int)v[now.id].size(); i++){
            node next = {v[now.id][i], now.level + 1};
            q.push(next);
        }
    }
}

int main(){
    cin >> n >> m;
    v.resize(n + 1);
    l.resize(n + 1);
    for (int i = 0; i < m; i++){
        int id, k;
        cin >> id >> k;
        v[id].resize(k);
        for (int j = 0; j < (int)v[id].size(); j++){
            cin >> v[id][j];
        }
    }  // 构建树

    node root = {1, 1};
    bfs(root);
    for (int i = 1; i <= n; i++){
        if (maxn < l[i]){
            maxn = l[i];
            maxl = i;
        }
    }
    cout << maxn << " " << maxl << endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_74092648/article/details/142988154