zoukankan      html  css  js  c++  java
  • 「一本通 5.2 例 5」皇宫看守

    题目描述

    太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫。

    皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状,某些宫殿间可以互相望见。大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候看守,在不同的宫殿安排看守所需的费用不同。

    可是陆小凤手上的经费不足,无论如何也没法在每个宫殿都安置留守侍卫。

    帮助陆小凤布置侍卫,在看守全部宫殿的前提下,使得花费的经费最少。

    Picture1

    输入格式

    输入中数据描述一棵树,描述如下:

    第一行

    ,表示树中结点的数目。

    第二行至第

    行,每行描述每个宫殿结点信息,依次为:该宫殿结点标号 ,在该宫殿安置侍卫所需的经费 ,该边的儿子数 ,接下来 个数,分别是这个节点的 个儿子的标号

    对于一个

    个结点的树,结点标号在

    之间,且标号不重复。

    输出格式

    输出最少的经费

    样例

    样例输入

    6
    1 30 3 2 3 4
    2 16 2 5 6
    3 5 0
    4 4 0
    5 11 0
    6 5 0
    

    样例输出

    25
    

    样例解释

    有六个区域被安排的情况如左图所示。

    如右图,灰色点安排了警卫,

    号警卫可以观察 号警卫可以观察 号警卫可以观察

    总费用:

    Picture2 Picture3

    数据范围与提示

    对于

    的数据,

    显示分类标签

    一道覆盖点的题

    dp[u][0] 表示u由父节点覆盖

    dp[u][1] 表示u由儿子覆盖

    dp[u][2] 表示u由自己覆盖

    #include<bits/stdc++.h>
    #define inf 0x3f3f3f3f
    using namespace std;
    
    const int maxn = 1505;
    
    int n,cost[maxn],head[maxn],size,dp[maxn][3],ru[maxn];
    
    struct edge{
        int v,nex;
    }e[maxn<<1];
    
    void adde(int u,int v){
        e[size].v=v;e[size].nex=head[u];head[u]=size++;
    }
    
    void dfs(int u,int fa){
        //if(ru[u]==1) return ;
        int d=inf;
        dp[u][2]=cost[u];
        for(int i=head[u];~i;i=e[i].nex){
            int v=e[i].v;
            if(v == fa) continue;
            dfs(v,u);
            dp[u][0]+=min(dp[v][1],dp[v][2]);
            dp[u][1]+=min(dp[v][1],dp[v][2]);d=min(d,dp[v][2]-min(dp[v][2],dp[v][1]));//最精髓的转化
            dp[u][2]+=min(dp[v][0],min(dp[v][1],dp[v][2]));
        }
        dp[u][1]+=d;
    }
    
    int main(){
        memset(head,-1,sizeof(head));
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            int u,t;scanf("%d",&u);
            scanf("%d%d",&cost[u],&t);
            for(int j=1;j<=t;j++){
                int v;scanf("%d",&v);adde(u,v);adde(v,u);ru[u]++,ru[v]++;
            }
            if(t==0) dp[u][0]=0,dp[u][1]=dp[u][2]=cost[u];
        }
        dfs(1,-1);
        printf("%d",min(dp[1][1],dp[1][2]));
    }
    View Code
  • 相关阅读:
    sprint2第五天任务完成情况
    sprint2第四天任务完成情况
    sprint2第三天任务完成情况
    spark编程基础1
    git基本命令
    自定义bean对象实现序列化接口(Writable)
    HDFS 2.X新特性
    win10-idea连接hdfs集群
    centos6-yum源失效问题
    hadoop-源码编译
  • 原文地址:https://www.cnblogs.com/plysc/p/10579638.html
Copyright © 2011-2022 走看看