CF1067E Random Forest Rank

https://www.luogu.com.cn/problem/CF1067E

丢个同学写的:https://www.cnblogs.com/klii/p/15885851.html

主要的结论是:一个树/森林的邻接矩阵的秩,等于最大匹配数*2。

code:

#include<bits/stdc++.h>
#define mod 998244353
#define N 500050
#define ll long long
using namespace std;
const ll inv2 = (mod + 1) / 2;
ll f[N], ans;
vector<int> g[N];
void dfs(int u, int fa) {
    f[u] = 1;
    for(int v : g[u]) {
        if(v == fa) continue;
        dfs(v, u);
        f[u] = f[u] * (inv2 + inv2 * f[v] % mod) % mod;
    }
    f[u] = (1 - f[u] + mod) % mod;
    ans = (ans + f[u]) % mod;
}
int n;
int main() {
    scanf("%d", &n);
    ll pw = 2;
    for(int i = 1; i < n; i ++) { pw = pw * 2 % mod;
        int u, v;
        scanf("%d%d", &u, &v);
        g[u].push_back(v), g[v].push_back(u);
    }

    dfs(1, 1);
    printf("%lld", ans * pw % mod);
    return 0;
}
posted @ 2022-02-16 15:36  lahlah  阅读(28)  评论(0编辑  收藏  举报