「一本通 5.2 例 5」皇宫看守

Posted plysc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「一本通 5.2 例 5」皇宫看守相关的知识,希望对你有一定的参考价值。

题目描述

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

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

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

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

技术图片

输入格式

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

第一行

,表示树中结点的数目。

第二行至第

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

对于一个

个结点的树,结点标号在

之间,且标号不重复。

输出格式

输出最少的经费

样例

样例输入

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

样例解释

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

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

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

总费用:

 

技术图片 技术图片

数据范围与提示

对于

的数据,

显示分类标签

一道覆盖点的题

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

 

以上是关于「一本通 5.2 例 5」皇宫看守的主要内容,如果未能解决你的问题,请参考以下文章

皇宫看守

皇宫看守

信息学奥赛一本通 5.2 树形动态规划

树形DP皇宫看守

AcWing 1077. 皇宫看守

皇宫看守 树形dp