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