[SDOI2006] 保安站岗
题目链接
第一遍不知道为什么就爆零了……
第二遍改了一下策略,思路没变,结果不知道为什么就 A 了???
树形 DP 经典问题:选择最少点以覆盖树上所有点(边)。
对于本题,设 dp[i][0/1][0/1] 表示第 i 个节点,其父亲节点选 / 没选中,且选 / 不选当前节点的最小代价。
发现选中当前点时,周围的点就爱怎样怎样了,自然是选费用小的……没选中时,如果父亲节点选了那同上;
如果父亲也没选,那么对于其子节点:
如果存在一个满足“选择它的代价比不选它的小”,那么一定贪心的选了它,其他的就依然爱怎样怎样了(无情)……
如果没有这样的一个子节点,那就只好选一个费用差的最小的选了它 233。
代码:
#include <queue>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int maxn = + ;
int n, m, head[maxn], val[maxn], dp[maxn][][], edge_num; struct Edge { int v, nxt; } edge[maxn << ]; inline int read() {
register char ch = ; register int w = , x = ;
while( !isdigit(ch) ) w |= (ch == '-'), ch = getchar();
while( isdigit(ch) ) x = (x * ) + (ch ^ ), ch = getchar();
return w ? -x : x;
} inline void Add_edge(int u, int v) {
edge[++edge_num].v = v;
edge[edge_num].nxt = head[u], head[u] = edge_num;
} inline void Deep_fs(int x, int p) {
int flag = , tmp = 1e8;
for(int i = head[x]; i; i = edge[i].nxt) {
if( edge[i].v == p ) continue;
Deep_fs(edge[i].v, x);
if( dp[edge[i].v][][] >= dp[edge[i].v][][] ) flag = ;
dp[x][][] = dp[x][][] + min(dp[edge[i].v][][], dp[edge[i].v][][]);
dp[x][][] = dp[x][][] + min(dp[edge[i].v][][], dp[edge[i].v][][]);
dp[x][][] = dp[x][][] + min(dp[edge[i].v][][], dp[edge[i].v][][]);
dp[x][][] = dp[x][][] + min(dp[edge[i].v][][], dp[edge[i].v][][]);
}
if( !flag ) for(int i = head[x]; i; i = edge[i].nxt) {
if( edge[i].v == p ) continue;
tmp = min(tmp, dp[x][][] - dp[edge[i].v][][] + dp[edge[i].v][][]);
}
if( !flag ) dp[x][][] = tmp;
dp[x][][] = dp[x][][] + val[x], dp[x][][] = dp[x][][] + val[x];
} int main(int argc, const char *argv[])
{
freopen("..\\nanjolno.in", "r", stdin);
freopen("..\\nanjolno.out", "w", stdout); scanf("%d", &n);
for(int u, v, k, i = ; i <= n; ++i) {
u = read(), val[u] = read(), k = read();
for(int j = ; j <= k; ++j) v = read(), Add_edge(u, v), Add_edge(v, u);
}
Deep_fs(, ), printf("%d\n", min(dp[][][], dp[][][])); fclose(stdin), fclose(stdout);
return ;
}
—— 花朵以芬芳熏香了空气;但它最终的任务,是把自己献上给你。
人们从诗人的字句里,选取自己心爱的意义:但是诗句的最终意义, 是指向着你。
[SDOI2006] 保安站岗的更多相关文章
- C++ 洛谷 P2458 [SDOI2006]保安站岗 from_树形DP
P2458 [SDOI2006]保安站岗 没学树形DP的,看一下. 题目大意:一棵树有N个节点,现在需要将所有节点都看守住,如果我们选择了节点i,那么节点i本身,节点i的父亲和儿子都会被看守住. 每个 ...
- Luogu P2458 [SDOI2006]保安站岗(树形dp)
P2458 [SDOI2006]保安站岗 题意 题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下 ...
- 洛谷【P2458】[SDOI2006]保安站岗 题解 树上DP
题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...
- [luogu 2458][SDOI2006]保安站岗
题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...
- Luogu P2458 [SDOI2006]保安站岗【树形Dp】
题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...
- [Luogu2458][SDOI2006]保安站岗
题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...
- P2458 [SDOI2006]保安站岗[树形dp]
题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...
- 洛谷 P2458 [SDOI2006]保安站岗
题目传送门 解题思路: 树形DP 可知一个点被控制有且仅有一下三种情况: 1.被父亲节点上的保安控制 2.被儿子节点上的保安控制 3.被当前节点上的保安控制 我们设dp[0/1/2][u]表示u节点所 ...
- [Luogu][P2458] [SDOI2006]保安站岗
题目链接 看起来似乎跟最小点覆盖有点像.但区别在于: 最小点覆盖要求所有边在其中,而本题要求所有点在其中. 即:一个点不选时,它的儿子不一定需要全选. 画图理解: 对于这样一幅图,本题中可以这样选择: ...
随机推荐
- java10.0.2和java 11.0.1配置环境变量
java10.0.2 在网上找了各种方法一直也没配好打开jak下的lib文件夹发现并没有tools.jar,后经查询jdk-9后就没有了上述.jar文件所以我的配置方法如下 ClASSPATH C:\ ...
- ASP.NET Zero--前端应用程序
前端应用程序 ASP.NET Zero包含可以作为您的公共网站或应用程序着陆页的起点的前端页面.首次运行项目时,您会看到主页如下所示: 这里有两页:主页和关于.这些页面的内容只是占位符和演示目的.您可 ...
- windows环境下安装yaf框架
windows环境下安装yaf框架 在windows下安装yaf框架 准备工作: php环境(过程略,wamp,xampp,phpstudy都行,php版本大于5.3) git工具(需要从github ...
- STP生成树协议
STP主要作用 1.消除环路:通过阻断冗余链路来消除网络中可能存在的链路 2.链路备份:当活动那个路径发生故障时,激活备份链路,及时恢复网络连通性. 根桥选举 每个交换机启动STP后,都认为自己是根桥 ...
- Java基础——1 一切都是对象
- log4j控制指定包下的日志
最近观察日志发现如下两个问题: 1.项目用的是springboot项目,整合了rabbitmq,项目启动后,会自动监控rabbitmq谅解是否正常,导致控制台一直输出监控日志,此时就想阻止该类日志输出 ...
- 给Integer对象加锁的错误方式
package com.thread.test; public class BadLockOnInteger implements Runnable { public static Integer i ...
- slice()和splice()区别
1.slice(start,end):方法可从已有数组中返回选定的元素,返回一个新数组,包含从start到end(不包含该元素)的数组元素. 注意:该方法不会改变原数组,而是返回一个子数组,如果想删除 ...
- leetcode 224. Basic Calculator 、227. Basic Calculator II
这种题都要设置一个符号位的变量 224. Basic Calculator 设置数值和符号两个变量,遇到左括号将数值和符号加进栈中 class Solution { public: int calcu ...
- js获取浏览器窗体最大化事件
<mce:script language="javascript"><!--function ReSet() {document.getElementById(& ...