zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    nginx中的超时配置
    ubuntu系统TCP连接参数优化-TIME_WAIT过多解决办法
    python中的raise用法
    pip安装各种模块
    ubuntu上安装python的ldap模块
    docker 打印带时间的日志
    基于Xilinx Zynq Z7045 SoC的CNN的视觉识别应用
    VIVADO下IBERT使用指南
    菜根谭全文及译文
    bit,Byte,Word,DWORD(DOUBLE WORD,DW)
  • 原文地址:https://www.cnblogs.com/a1b3c7d9/p/11007465.html
Copyright © 2011-2022 走看看