题意:

给出一个树以及一些覆盖每个点的花费,求每个点都能被自己被覆盖,或者相邻的点被覆盖的最小价值。

细节:

其实我乍一眼看过去还以为是 战略游戏 的复制版 可爱的战略游戏在这里QAQ(请原谅这波广告)

显然这是一个巨坑,所以必须先来看一张神奇的图片~ ~ ~ ~ ~

帅气的图片在这里QVQ

我们显然很轻松的找出了反例,那该如何解决呢?

分析:

不难发现对于从上往下的第二个节点,它的儿子和它都不需要被覆盖也是合法的,所以对于一个节点在图中来说,合法状态有:它被覆盖其儿子父亲都被覆盖或都不被或其中一个被覆盖,它不被覆盖其儿子父亲都被覆盖或其中一个被覆盖。

所以对于一个节点来说它的状态有:1.它的父亲被覆盖; 2.它的儿子被覆盖; 3.它自己被覆盖;

所以状态 dp[u][0/1/2] 表示的就是上述三种情况

转移如下:

dp[u][0] = ∑ min( dp[v][1] , dp[v][2])

dp[u][1] = ∑ min( dp[v][1] , dp[v][2]) + del

dp[u][2] = ∑ min( dp[v][1] , dp[v][2] , dp[v][0] ) + val[u]

del = min( dp[v][2] - min(dp[v][1] , dp[v][2] )

del 指的是什么?首先关键还是在于状态节点 u 被其儿子覆盖的合法状态,这就说明了其儿子之中必须存在一个节点是把自己覆盖的,所以我们只要最有加上这个 del 问题就迎刃而解啦~~~

代码:

#include<bits/stdc++.h>
#define MAXN 300005
#define LL long long
using namespace std; int val[MAXN], n;
vector<int> Right[MAXN];
LL f[MAXN][3]; void dfs(int u, int fa){
f[u][0]=0, f[u][1]=0, f[u][2]=val[u];
LL del=3000000000ll;
for (int i=0; i<Right[u].size(); i++) {
int v=Right[u][i];
if (v==fa) continue;
dfs(v, u);
f[u][0]+=min(f[v][1], f[v][2]);
f[u][1]+=min(f[v][1], f[v][2]);
f[u][2]+=min(f[v][0], min(f[v][1], f[v][2]));
del=min(del, f[v][2]-min(f[v][1], f[v][2]));
}
f[u][1]+=del;
} int main(){
scanf("%d", &n);
for (int i=1, x, num; i<=n; i++) {
scanf("%d", &x);
scanf("%d%d", &val[x], &num);
for (int j=1, y; j<=num; j++){
scanf("%d", &y);
Right[x].push_back(y);
Right[y].push_back(x);
}
}
dfs(1, 0);
printf("%lld\n", min(f[1][1], f[1][2]));
return 0;
}

Vijos1144 皇宫看守 (0/1/2三种状态的普通树形Dp)的更多相关文章

  1. 一级缓存、二级缓存、延迟加载、hibernate session 域 pojo三种状态

    1.一级缓存(session缓存 ).二级缓存      意义:提高hibernate查询效率.    缺点:可能会因并发,产生数据不一致.      本质:基于session 的缓存,利用hiber ...

  2. Hibernate 对象的三种状态

    hibernate对象的三种状态: (一) 瞬时(临时)状态:   对象被创建时的状态,数据库里面没有与之对应的记录! (二) 持久状态:   处于session的管理中,并且数据库里面存在与之对应的 ...

  3. OID,主键生成策略,PO VO DTO,get和load区别,脏检查,快照,java对象的三种状态

    主键生成策略 sequence 数据库端 native 数据库端 uuid  程序端 自动赋值 生成的是一个32位的16进制数  实体类需把ID改成String 类型 assigned  程序端 需手 ...

  4. hibernate的三种状态(儿)

    第五讲:hibernate的三种状态 瞬时:bean对象与session,与数据库无关.在session对象的save方法保存之前. 持久状态(托管):bean对象与session有关,数据库中有对应 ...

  5. HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口

    1.在hibernate中持久化对象有三个状态,这个面试时可能会问到: (1)transient瞬时态:在数据库中没有与之匹配的数据,一般就是只new出了这个对象,并且在session缓存中也没有即此 ...

  6. Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别

    首先,用一张图说明一个对象,在Hibernate中,在调用了不同方法之后对象所处的不同状态 在Hibernate中,一个对象的状态可以被分为如图所示的三种 Transient:瞬时对象,该对象在数据库 ...

  7. WPF中CheckBox三种状态打勾打叉和滑动效果

    本文分为两个demo, 第一个demo实现checkBox的打叉或打勾的效果: 第二个demo部分实现checkBox的滑动效果. Demo1: wpf的CheckBox支持三种状态,但是美中不足的是 ...

  8. hibernate操纵数据库常用方法 及 hibernate对象的三种状态

    在dao层使用hibernate语言来与数据库进行访问,hibernate作为面向对象思想开发的dao层框架其理解也需要以面向对象的思想来看待 使用.hibernate不仅支持使用者使用他提供的对象来 ...

  9. 【翻译】checkbox的第三种状态

    checkbox只有两种值:选中(checked)或未选中(unchecked).它可以有任何值,但是表单提交时checkbox的值只能是checked或unchecked.它的默认值是uncheck ...

随机推荐

  1. jqgrid 分级标题

    参考地址:http://www.trirand.com/jqgridwiki/doku.php?id=wiki:groupingheadar Grouping of the header should ...

  2. Codeforces Round #544 (Div. 3) A.Middle of the Contest

    链接:https://codeforces.com/contest/1133/problem/A 题意: 给两个时间点,求中间时间点. 思路: 数学 代码: #include <bits/std ...

  3. 洛谷P2502[HAOI2006]旅行

    题目: Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N个景点(编号为1,2,3,-,N),这些景点被M条道路连接着,所有道路都是双向的,两个景点之间可能有多条道路.也许 ...

  4. 使用PlSQLDeveloper工具查询Oracle会话数

    PlSQLDeveloper工具提供了会话管理功能. 能够查询会话内容.杀死会话.查看会话SQL等操作. 常用的会话查询SQL如下: -- 查询所有会话 select * from v$session ...

  5. IIR型高斯滤波的原理及实现

    二.实现 GIMP中有IIR型高斯滤波的实现,代码位于contrast-retinex.c中,读者可自行查看.下面给出本人实现的核心代码: #include"stdafx.h" t ...

  6. 74LVC2G241双缓冲3态驱动器

  7. Tomcat+Jenkins+SonarQube+SVN+Maven 集成自动化环境搭建(Windows10环境下)

    说在前面的话: 从接到任务到完成共用了7天的时间.正常人用不到这个时间. 此时的功能表现是: 登录本地JenKins对项目进行构建,能够自动从SVN读取最新代码并按照Maven项目构建,构建完成能够自 ...

  8. Data Center Manager Leveraging OpenStack

    这是去年的一个基于OpenStack的数据中心管理软件的想法. Abstract OpenStack facilates users to provision and manage cloud ser ...

  9. COGS 827. [Tyvj Feb11] 网站计划

    输入文件:web.in   输出文件:web.out   简单对比时间限制:1 s   内存限制:128 MB 描述 Description     Tyvj的Admin--zhq同学将在寒假开始实行 ...

  10. elasticsearch插入索引文档 对数字字符串的处理

    对于字符串在搜索匹配的时候,字符串是数字的话需要匹配的是精准匹配,如果是部分匹配字符串的话,需要进行处理,把数字型字符串作为一个字符中的数组表示插入之后显示如下: 如果插入之后显示如画线部分的话,则表 ...