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';
}

浙公网安备 33010602011771号