题解 | #快乐节点#

快乐节点

https://www.nowcoder.com/practice/f28bccea385e4cd0a472bfc4859b2290

#include <bits/stdc++.h>


// 多源头广度优先遍历!
using namespace std;

int main() {
    int n, m, u, v;
    cin >> n >> m;

    vector<vector<int>> tree(n + 1, vector<int>());

    vector<bool> vis(n + 1, false);

    for (int i = 1; i <= n - 1; i++) {
        cin >> u >> v;
        tree[u].push_back(v);
    }

    int k, e;

    cin >> k; // 特殊点的个数!

    queue<int> q;

    for (int i = 1; i <= k; i++) {
        cin >> e;
        vis[e] = true;
        q.push(e);
    }

    multiset<int> ret;

    while (!q.empty()) {
        int size = q.size();
        if (m == -1) break;
        while (size--) {
            int pop = q.front();
            q.pop();
            ret.insert(pop);
            for (auto next : tree[pop]) {
                if (!vis[next]) {
                    q.push(next);
                    vis[next] = true;
                }
            }
        }
        m--;
    }
    cout << ret.size() << endl;
    for (auto val : ret) cout << val << " ";
    return 0;
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务