题解 | 在树上游玩

在树上游玩

https://www.nowcoder.com/practice/8c0d60834a924ce98e7425fed9c62ab8

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

int main() {
    constexpr int MOD = 1e9 + 7;

    // construct
    int n, k; cin >> n >> k;
    vector<vector<int>> tree(n);
    vector<bool> marked(n);

    for (int i = 0; i != k; ++i) {
        int index; cin >> index; --index;
        marked[index] = true;
    }

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

    // dfs
    vector<bool> visited(n);
    auto dfs = [&](auto&& dfs, int node, int parent) -> int {
        visited[node] = true;
        int count = 0;
        for (int neighbor : tree[node]) {
            if (!marked[neighbor]) {
                ++count;
            } else if (neighbor != parent) {
                count += dfs(dfs, neighbor, node);
            }
        }
        return count;
    };

    int count = 0;
    uintmax_t ways = 1;
    for (int i = 0; i < marked.size(); ++i) {
        if (marked[i] && !visited[i]) {
            ++count;
            ways = (ways * dfs(dfs, i, -1)) % MOD;
        }
    }

    cout << count << ' ' << ways;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

09-19 13:59
门头沟学院 Java
猪脚饭之王:直接丢给cursor
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务