luoguP2016 战略游戏
题目描述
给定一棵树,一个点覆盖与之连接的边,求最少要用多少点可以覆盖这棵树。
solution
典型的树形DP,我就只能做这种没有什么技术含量的水题了QwQ
显然对于一个点可以选或不选
如果这个点不选,则他的儿子必须选
如果这个点选了,就随便了QwQ
#include<bits/stdc++.h> using namespace std; #define MAXN 2000 inline int read() { int f=1,x=0; char ch; do { ch=getchar(); if(ch=='-') f=-1; }while(ch<'0'||ch>'9'); do { x=(x<<3)+(x<<1)+ch-'0'; ch=getchar(); }while(ch>='0'&&ch<='9'); return f*x; } int n,ans=1<<30; int f[MAXN][2]; vector<int>son[MAXN]; inline void dp(int x,int fa) { f[x][0]=0; f[x][1]=1; for(int i=0;i<son[x].size();i++) { int v=son[x][i]; if(v!=fa) { dp(v,x); f[x][0]+=f[v][1]; f[x][1]+=min(f[v][0],f[v][1]); } } } int main() { n=read(); for(int i=1;i<=n;i++) { int u=read(),k=read(); for(int i=1;i<=k;i++) { int v=read(); son[v].push_back(u); son[u].push_back(v); } } for(int i=0;i<n;i++) dp(i,-1),ans=min(ans,min(f[i][0],f[i][1])); printf("%d\n",ans); }