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
  • 相关阅读:
    POJ 1611 The Suspects
    POJ 2001 Shortest Prefixes(字典树)
    HDU 1251 统计难题(字典树 裸题 链表做法)
    G++ C++之区别
    PAT 乙级 1013. 数素数 (20)
    PAT 乙级 1012. 数字分类 (20)
    PAT 乙级 1009. 说反话 (20)
    PAT 乙级 1008. 数组元素循环右移问题 (20)
    HDU 6063 17多校3 RXD and math(暴力打表题)
    HDU 6066 17多校3 RXD's date(超水题)
  • 原文地址:https://www.cnblogs.com/plysc/p/10579638.html
Copyright © 2011-2022 走看看