zoukankan      html  css  js  c++  java
  • 洛谷P2016 战略游戏

    P2016 战略游戏

    题目描述

    Bob喜欢玩电脑游戏,特别是战略游戏。但是他经常无法找到快速玩过游戏的办法。现在他有个问题。

    他要建立一个古城堡,城堡中的路形成一棵树。他要在这棵树的结点上放置最少数目的士兵,使得这些士兵能了望到所有的路。

    注意,某个士兵在一个结点上时,与该结点相连的所有边将都可以被了望到。

    请你编一程序,给定一树,帮Bob计算出他需要放置最少的士兵.

    输入输出格式

    输入格式:

    第一行 N,表示树中结点的数目。

    第二行至第N+1行,每行描述每个结点信息,依次为:该结点标号i,k(后面有k条边与结点I相连)。

    接下来k个数,分别是每条边的另一个结点标号r1,r2,...,rk。

    对于一个n(0<n<=1500)个结点的树,结点标号在0到n-1之间,在输入数据中每条边只出现一次。

    输出格式:

    输出文件仅包含一个数,为所求的最少的士兵数目。

    例如,对于如下图所示的树:

       0

    1 2 3

    答案为1(只要一个士兵在结点1上)。

    输入输出样例

    输入样例#1:
    4
    0 1 1
    1 2 2 3
    2 0
    3 0
    
    输出样例#1:
    1
    /*
        简单的树形dp
        f[i][0]表示以i为根的子树全部被覆盖并且i处没有士兵的最小代价 
        f[i][1]表示以i为根的子树全部被覆盖并且i处有士兵的最小代价
        如果i处没有士兵就必须保证它的儿子节点都被选,有士兵则不必都被选 
    */
    #include<iostream>
    #include<cstdio>
    using namespace std;
    #define maxn 1510
    int n,num,head[maxn],f[maxn][2];
    struct node{
        int to,pre;
    }e[maxn*2];
    void Insert(int from,int to){
        e[++num].to=to;
        e[num].pre=head[from];
        head[from]=num;
    }
    void dfs(int now,int fa){
        bool flag=0;//判断是否为叶子节点 
        int sum1=0,sum0=0;
        for(int i=head[now];i;i=e[i].pre){
            int to=e[i].to;
            if(to==fa)continue;
            flag=1;
            dfs(to,now);
            sum0+=f[to][1];
            sum1+=min(f[to][1],f[to][0]);
        }
        if(!flag){//是叶子节点 
            f[now][0]=0;
            f[now][1]=1;
            return;
        }
        f[now][0]=sum0;
        f[now][1]=sum1+1;
    }
    int main(){
        scanf("%d",&n);
        int x,y,z;
        for(int i=1;i<=n;i++){
            scanf("%d%d",&x,&y);x++;
            for(int j=1;j<=y;j++){
                scanf("%d",&z);z++;
                Insert(x,z);Insert(z,x);
            }
        }
        dfs(1,0);
        int ans=min(f[1][1],f[1][0]);
        printf("%d",ans);
    }
  • 相关阅读:
    再次或多次格式化导致namenode的ClusterID和datanode的ClusterID之间不一致的问题解决办法
    Linux安装aria2
    POJ 3335 Rotating Scoreboard 半平面交
    hdu 1540 Tunnel Warfare 线段树 区间合并
    hdu 3397 Sequence operation 线段树 区间更新 区间合并
    hud 3308 LCIS 线段树 区间合并
    POJ 3667 Hotel 线段树 区间合并
    POJ 2528 Mayor's posters 贴海报 线段树 区间更新
    POJ 2299 Ultra-QuickSort 求逆序数 线段树或树状数组 离散化
    POJ 3468 A Simple Problem with Integers 线段树成段更新
  • 原文地址:https://www.cnblogs.com/thmyl/p/7552995.html
Copyright © 2011-2022 走看看