P2016 战略游戏(树上 DP)

限制条件:
当前节点放,子节点可放可空。
当前节点空,子节点必须放。
有根无根没有影响,可以指定。

基本等价于 P1352

#include<bits/stdc++.h>
using namespace std;
const int N=1509;
int n,dp[N][2];
vector<int> k[N];
void dfs(int i,int f){
    dp[i][1]=1;
    for(int j:k[i]) if(j!=f){
        dfs(j,i);
        dp[i][0]+=dp[j][1];
        dp[i][1]+=min(dp[j][0],dp[j][1]);
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1,u,a,b;i<=n;i++){
        scanf("%d%d",&u,&a);
        while(a--) scanf("%d",&b),k[u].push_back(b),k[b].push_back(u);
    }
    dfs(0,-1),printf("%d\n",min(dp[0][0],dp[0][1]));
    return 0;
}
posted @ 2026-02-17 20:31  2025ing  阅读(0)  评论(0)    收藏  举报