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;
    }
    
  • 相关阅读:
    如何用Java编写一段代码引发内存泄露
    获取一天的开始时间和结束时间
    servlet,jsp,tomcat,jdk对应版本关系,如何查看jsp和servlet版本信息
    什么是元数据?
    什么是Device ID?
    如何查看移动设备标识码
    手机wifi的mac地址是什么??
    MD5摘要
    落地页和离线广告
    广告行业一些常用物料的尺寸
  • 原文地址:https://www.cnblogs.com/a1b3c7d9/p/11007465.html
Copyright © 2011-2022 走看看