题目传送门

解题思路:

树形DP

可知一个点被控制有且仅有一下三种情况:

1、被父亲节点上的保安控制

2、被儿子节点上的保安控制

3、被当前节点上的保安控制

我们设dp[0/1/2][u]表示u节点所在子树中全部被控制的最小代价,0表示只有u节点尚未被控制(等待被其父亲节点控制);

1表示u节点已经被控制,但u节点上没有保安,所以不能去控制其父亲节点;2表示u节点上有保安

(机房的神犇说多维数组要把小的那一维写在前面,因为可以优化常数,原理请自行翻阅一本通)

转移:(以下设v是u的儿子节点)

dp[0][u]=∑min(dp[1][v],dp[2][v]) i节点上反正没有保安,那么儿子节点只要保证全部控制即可,显然1,2状态都是满足的

dp[1][u]=∑min(dp[1][v],dp[2][v]) + 某一个dp[2][v] 也就是说对于其中一个儿子取dp[2][v]而其他儿子取min(dp[1][v],dp[2][v])意为i号点必须要找一个儿子来覆盖它,其余随意。这个地方涉及到了算法复杂度的问题,楼下有些题解在这里写的是O(n^2)的转移,但实际上完全可以做到O(n)。具体在代码中细讲。

dp[2][u]=∑min(dp[0][v],dp[1][v],dp[2][v])+val[u] 这个就简单了,i号点上反正有保安了,所有儿子节点都无所谓了,全部可以转移。

AC代码:

 #include<iostream>
#include<cstdio>
#include<vector>
#include<cstring> using namespace std; int n,a[],k,m,f[][];
vector<int> l[]; inline void dfs(int root,int fa) {
bool flag = ;
int sum = ,_min = 0x3f3f3f3f,id = ;
f[root][] = a[root];
f[root][] = f[root][] = ;
for(int i = ;i < l[root].size(); i++) {
if(fa == l[root][i]) continue;
dfs(l[root][i],root);
f[root][] += min(f[l[root][i]][],f[l[root][i]][]);//被父亲保
f[root][] += min(f[l[root][i]][],f[l[root][i]][]);//被儿子保
if(f[l[root][i]][] > f[l[root][i]][]) flag = ;
else _min = min(_min,f[l[root][i]][] - f[l[root][i]][]);
f[root][] += min(f[l[root][i]][],min(f[l[root][i]][],f[l[root][i]][]));//自保
}
if(!flag)
f[root][] += _min;
} int main() {
scanf("%d",&n);
for(int i = ;i <= n; i++) {
scanf("%d%d%d",&k,&a[i],&m);
for(int j = ;j <= m; j++) {
int x;
scanf("%d",&x);
l[k].push_back(x);
l[x].push_back(k);
}
}
memset(f,,sizeof(f));
dfs(,-);
printf("%d",min(f[][],f[][]));
return ;
}

洛谷 P2458 [SDOI2006]保安站岗的更多相关文章

  1. C++ 洛谷 P2458 [SDOI2006]保安站岗 from_树形DP

    P2458 [SDOI2006]保安站岗 没学树形DP的,看一下. 题目大意:一棵树有N个节点,现在需要将所有节点都看守住,如果我们选择了节点i,那么节点i本身,节点i的父亲和儿子都会被看守住. 每个 ...

  2. Luogu P2458 [SDOI2006]保安站岗(树形dp)

    P2458 [SDOI2006]保安站岗 题意 题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下 ...

  3. Luogu P2458 [SDOI2006]保安站岗【树形Dp】

    题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...

  4. P2458 [SDOI2006]保安站岗[树形dp]

    题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...

  5. [Luogu][P2458] [SDOI2006]保安站岗

    题目链接 看起来似乎跟最小点覆盖有点像.但区别在于: 最小点覆盖要求所有边在其中,而本题要求所有点在其中. 即:一个点不选时,它的儿子不一定需要全选. 画图理解: 对于这样一幅图,本题中可以这样选择: ...

  6. 洛谷【P2458】[SDOI2006]保安站岗 题解 树上DP

    题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...

  7. 洛谷P2458 保安站岗

    传送门啦 分析: 树形dp刚刚入门,这是我做的第一个一个点同时受父亲节点和儿子节点控制的题目. 由于这个题中某一个点放不放保安与父亲和儿子都有关系(因为线段的两个端点嘛),所以我们做题时就要考虑全面. ...

  8. [luogu 2458][SDOI2006]保安站岗

    题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...

  9. [Luogu2458][SDOI2006]保安站岗

    题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...

随机推荐

  1. 【随缘更(gu)】牛客D4简要思路(没有题解)

    T1 当然不能枚举每个区间,于是我们考虑算贡献. 对于每个位置i,我们计算其作为区间内第一个出现ai的位置的区间总数,则有ans=sigma( i - last[i] ) * ( n - i + 1 ...

  2. SICOM SOP

    SOPs A Service-Object Pair (SOP) Class is defined by the union of an Information Object Definition ( ...

  3. 106、Java中String类之使用contains()方法判断子字符串是否存在

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  4. Waiting for table metadata lock 错误

    在 alter table 时,必然出现了 lock 错误,检查 processlist ,全都是 sleep 状态,然后检查 information_schema.innodb_trx 发现一个活跃 ...

  5. 5.7 Nginx 其他模块

  6. 浏览器 canvas下载图片 网络错误

    在使用html2canvas截取页面的时候发现图片死活保存不到本地,chrome一直报“网络错误”, 主要出现这个问题是canvas保存图片到本地时各个浏览器像素的限制不同, 所以将图片数据转换成Bl ...

  7. java校招一些面试的题目

    数组和链表的区别 数组静态分配内存,链表动态分配内存: 数组在内存中连续,链表不一定连续: 数组元素在栈区,链表元素在堆区: 数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n) 数 ...

  8. 吴裕雄--天生自然JAVAIO操作学习笔记:字节流与字符流操作

    import java.io.* ; public class Copy{ public static void main(String args[]){ if(args.length!=2){ // ...

  9. vue axios 数据请求实现

    1.安装nginx npm install axios --save-dev cnpm install axios --save-dev 使用淘宝镜像 保存依赖文件到本地 装好了.packjson.j ...

  10. P1076 Wifi密码

    P1076 Wifi密码 转跳点: