feat: 添加P2016.cpp实现最小顶点覆盖算法

实现了一个动态规划算法来解决树结构的最小顶点覆盖问题。使用深度优先搜索遍历树结构,并通过动态规划计算每个节点的两种状态值,最终输出根节点的最优解。
This commit is contained in:
Zengtudor 2025-08-30 13:43:05 +08:00
parent a026979a58
commit 8894e59851

57
src/8/30/P2016.cpp Normal file
View File

@ -0,0 +1,57 @@
/*
*/
#include <algorithm>
#include <cstdint>
#include <cstdio>
#include <iostream>
#include <istream>
#include <vector>
using ll = int64_t;
const ll inf = 1e9;
ll n;
std::vector<std::vector<ll>> edg,dp;
static inline void dfs(ll f,ll u){
for(ll v:edg[u]){
if(v==f)continue;
dfs(u,v);
dp[u][1]+=std::min(
dp[v][0],
dp[v][1]
);
dp[u][0]+=dp[v][1];
}
}
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n;
edg.resize(n);
dp.resize(n,std::vector<ll>(2,0));
for(ll i=1;i<=n;++i){
dp[i-1][1]=1;
ll u,k;
std::cin>>u>>k;
for(ll j=1;j<=k;++j){
ll v;
std::cin>>v;
edg[u].push_back(v);
edg[v].push_back(u);
}
}
dfs(0, 0);
// for(ll i=0;i<n;i++){
// for(ll j=0;j<2;j++){
// printf("dp[%lld][%lld]=%lld\n",i,j,dp[i][j]);
// }
// }
std::cout<<std::min(dp[0][0],dp[0][1])<<"\n";
}