• Strategic game


    Strategic game

    给出一个有n个节点的树,定义选择一个点能被其控制的点为它自己和所有与它直接有边相连的点,问最少的点数,可以控制整棵树,(nleq 1500)

    不难得知为树形递推,没有确定根,故事先钦定一个根,于是设(f_i)表示以i为节点的子树中,能控制这棵子树的最少节点,显然当这棵子树的根节点不选时,无法保证该点所连的点有选择,故设(f[i][0/1])分别表示为以i为节点的子树中,是否选i,能控制这棵子树的最少节点,不难有

    [f[i][0]=sum_{jin son(i)}f[j][1] ]

    [f[i][1]=sum_{jin son(i)}max(f[j][0],f[j][1])+1 ]

    边界:叶结点初始化为0

    答案:(max(dp[r][0],dp[r][1])),r为你钦定的根节点。

    参考代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define il inline
    #define ri register
    using namespace std;
    struct point{
        int next,to;
    }ar[3500];
    bool check[1600];
    int at,head[1600],dp[1600][2];
    void dfs(int);
    il void link(int,int);
    il int min(int,int);
    int main(){
        int n;
        while(scanf("%d",&n)!=EOF){
            memset(head,0,sizeof(head)),at&=0;
            memset(dp,0,sizeof(dp)),memset(check,0,sizeof(check));
            for(int i(0),j,k,l;i<n;++i){
                scanf("%d:(%d)",&j,&k);
                while(k--)scanf("%d",&l),link(j,l),link(l,j);
            }dfs(0),printf("%d
    ",min(dp[0][0],dp[0][1]));
        }
        return 0;
    }
    il int min(int a,int b){
        return a<b?a:b;
    }
    void dfs(int x){
        check[x]|=true,dp[x][1]=1;
        for(int i(head[x]);i;i=ar[i].next)
            if(!check[ar[i].to])
                dfs(ar[i].to),dp[x][0]+=dp[ar[i].to][1],
                    dp[x][1]+=min(dp[ar[i].to][1],dp[ar[i].to][0]);
    }
    il void link(int u,int v){
        ar[++at].to=v,ar[at].
            next=head[u],head[u]=at;
    }
    
  • 相关阅读:
    移动端屏幕适配解决方案
    ES6学习笔记(1)——模块化
    弹性盒布局学习总结
    阮一峰之webpack-demos(译)
    阮一峰的Git分支管理策略之学习总结
    移动端测试之服务器搭建
    webApp 移动Touch框架
    Javascript 严格模式详解
    caller和callee的区别
    avalon 中require.config源码分析
  • 原文地址:https://www.cnblogs.com/a1b3c7d9/p/11007465.html
Copyright © 2020-2023  润新知