C. Edgy Trees

https://codeforces.com/problemset/problem/1139/C

题意:给定含有n个节点的数,每条边有一个颜色,黑色(1)或者白色(2)。现在要求长度为k的所有节点排列的路径中,包含了黑色的边的路径的数量,其中长度为k的节点排列里,可以有重复的节点。

思路:所有可能的路径数量为n^k,那么只要减去所有不包含黑色边的排列数量即可。多次遍历,每次找到所有的连通块,在遇到白色的边时继续深入,遇到黑色边停止。

总结:

inline void solve() {
    int n, k;
    cin >> n >> k;

    vector<vector<pair<int, int>>> al(n + 1);
    for (int i = 0; i < n - 1; ++i) {
        int u, v, c;
        cin >> u >> v >> c;
        al[u].emplace_back(v, c);
        al[v].emplace_back(u, c);
    }

    MInt ans = MInt::power(1ll * n, 1ll * k);
    int cnt = 0;
    vector<bool> vis(n + 1, false);
    auto dfs = [&](auto&& self, int u, int p)->int {
        vis[u] = true;
        int sz = 1;
        for (const auto& [v, c] : al[u]) {
            if (!vis[v] && !c) {
                sz += self(self, v, u);
            }
        }
        return sz;
    };

    for (int i = 1; i <= n; ++i) {
        if (!vis[i]) {
            MInt sz = dfs(dfs, i, 0);
            ans -= sz.power(k);
        }
    }
    cout << ans << '\n';
}
posted @ 2025-12-04 10:30  _Yxc  阅读(5)  评论(0)    收藏  举报