CF1032F Vasya and Maximum Matching 题解
题目链接:https://codeforces.com/problemset/problem/1032/F
很好的一道题,已严肃学习。
首先需要有一个重要的观察:一棵树有唯一最大匹配 \(\Longleftrightarrow\) 这棵树要么是一个单点,要么存在完美匹配。
这个证明是容易的,如果不存在完美匹配,则存在未被 cover 的点 \(u\),其邻居为 \(v\) 一定被 cover 了,设为 \((v,w)\),则边 \((v,w)\) 可以被 \((u,v)\) 平替。
基于这个观察,我们定义 \(f_{u,0/1/2}\) 表示只考虑 \(u\) 子树内的删/留边情况,\(u\) 是(0:孤立点)还是(1:和某一个儿子连边)或者(2:和父亲连边)的总方案数。
考虑转移:
- \(f_{u,0}\) 只要儿子不和父亲连即可。
\[f_{u,0}=\prod_{v\in son(u)}(f_{v,0}+f_{v,1}))
\]
- \(f_{u,1}\) 需要先枚举一个儿子连边,剩下的要么是 0 要么是 1,是 1 的时候这条边有删或不删两种情况。
\[f_{u,1}=\sum_{v\in son(u)}f_{v,2}\cdot \prod_{w\in son(u), w\neq v}(f_{w,0}+2f_{w,1})
\]
- 同理。
\[f_{u,2}=\prod_{v\in son(u)}(f_{v,0}+2f_{v,1})
\]
这样就完成了这道题,需要注意实现细节。时间复杂度 \(O(n)\)。
代码:
#include <bits/stdc++.h>
#define endl '\n'
#define lowbit(x) x&-x
#define pb push_back
#define sz(a) ((int)a.size())
#define ALL(a) a.begin(),a.end()
#define rev(x) reverse(ALL(x))
#define INF 0x3f3f3f3f
using namespace std;
template<class T,class U>bool chmin(T& a,const U& b){if(b<a){a=b;return true;}return false;}
template<class T,class U>bool chmax(T& a,const U& b){if(a<b){a=b;return true;}return false;}
using ll=long long;
using ull=unsigned long long;
using pii=pair<int,int>;
using i128=__int128_t;
const int MOD=998244353;
const int MAXN=3e5+10;
int n;
vector<int> G[MAXN];
int f[MAXN][3];
void dfs(int u,int p){
f[u][0]=1;
f[u][1]=0;
f[u][2]=1;
vector<int> pre;
for(auto v:G[u]){
if(v==p){
pre.pb(0);
continue;
}
dfs(v,u);
pre.pb(f[u][2]);
f[u][0]=1LL*f[u][0]*((f[v][0]+f[v][1])%MOD)%MOD;
f[u][2]=1LL*f[u][2]*((f[v][0]+(f[v][1]+f[v][1])%MOD)%MOD)%MOD;
}
int suf=1;
for(int i=sz(G[u])-1;i>=0;i--){
int v=G[u][i];
if(v==p)continue;
(f[u][1]+=1LL*f[v][2]*pre[i]%MOD*suf%MOD)%=MOD;
suf=1LL*suf*((f[v][0]+(f[v][1]+f[v][1])%MOD)%MOD)%MOD;
}
}
void solve(){
cin>>n;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
G[u].pb(v);
G[v].pb(u);
}
dfs(1,0);
cout<<(f[1][0]+f[1][1])%MOD<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t=1;
// cin>>t;
while(t--)
solve();
return 0;
}
本文来自博客园,作者:Jerry_Jiang,转载请注明原文链接:https://www.cnblogs.com/Jerry-Jiang/p/22578741

浙公网安备 33010602011771号