树形dp——覆盖所有边的最少费用(Protecting Zonk)
一、问题描述
有一个n(n<=10000)个节点的无根树。有两种装置A,B,每种都有无限多个。
1.在某个节点X使用A装置需要C1(C1<=1000)的花费,并且此时与节点X相连的边都被覆盖
2.在某个节点X使用B装置需要C2(C2<=1000)的花费,并且此时与节点X相连的边以及与节点X相连的点相连的边都被覆盖
求覆盖所有边的最小花费
二、问题分析
dp[u][0]:u没有安装装置,且u的子节点下的边都被覆盖
dp[u][1]:u安装装置A
dp[u][2]:u安装装置B
dp[u][3]:u没有安装装置,且v可以不安装装置
dp[u][0]=Sum( min(dp[v][1],dp[v][2]) );
dp[u][1]=min( C1+Sum( min(dp[v][0],dp[v][1],dp[v][2]) ),Sum( min(dp[v][2],dp[v][1],dp[v][0]) 且至少有一个子节点选择B) )
dp[u][2]=C2+Sum( min(dp[v][0],dp[v][1],dp[v][2],dp[v][3]) )
dp[u][3]=Sum(min(dp[v][0],dp[v][1],dp[v][2]))
三、代码实现
#include<stdio.h>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std; const int INF = 0x3f3f3f3f;
const int maxn = + ;
struct Edge
{
int to, next;
}e[maxn * ]; //dp[u][0]:u没有安装装置, 且u的子节点下的边都被覆盖
//dp[u][1] : u安装装置A
//dp[u][2] : u安装装置B
//dp[u][3] : u没有安装装置, 且v可以不安装装置
int head[maxn], d[maxn][];
int tot,n,C1,C2; int mostmin(int a, int b, int c)
{
return min(a, min(b, c));
} void init()
{
tot = ;
memset(head, -, sizeof(head));
} void addadge(int from, int to)
{
e[tot].to = to;
e[tot].next = head[from];
head[from] = tot++;
} void dfs(int u, int fa)
{
d[u][] = ; d[u][] = C1; d[u][] = C2; d[u][] = ;
int flag = , sum = , mi = INF;
for (int i = head[u]; i != -; i = e[i].next)
{
int v = e[i].to;
if (v == fa) continue;
dfs(v, u);
d[u][] += min(d[v][], d[v][]);
d[u][] += mostmin(d[v][], d[v][], d[v][]);
d[u][] += min(mostmin(d[v][], d[v][], d[v][]), d[v][]);
d[u][] += mostmin(d[v][], d[v][], d[v][]);
int tmp = mostmin(d[v][], d[v][], d[v][]);
sum += tmp;
mi = min(mi, d[v][] - tmp);
}
sum += mi;
d[u][] = min(d[u][], sum);
} int main()
{
while (scanf("%d%d%d",&n,&C1,&C2) == && n)
{
init();
int u, v; for (int i = ; i < n - ; i++)
{
scanf("%d%d", &u, &v);
addadge(u, v);
addadge(v, u);
}
dfs(, );
printf("%d\n", mostmin(d[][], d[][], d[][]));
}
return ;
}
树形dp——覆盖所有边的最少费用(Protecting Zonk)的更多相关文章
- 【hdu6613】Squrirrel 树形DP
题意:给一个带权树,求把一条边的权值变成0,再选一个点做根,最大深度最小是多少. \(\sum n \le 10^6\) key:树形DP 题里有边权小于等于200,然而并没有什么用. 首先做出 \( ...
- 4.13 省选模拟赛 树 树形dp 卷积 NTT优化dp.
考试的时候 看到概率 看到期望我就怂 推了一波矩阵树推自闭了 发现 边权点权的什么也不是. 想到了树形dp 维护所有边的断开情况 然后发现数联通块的和再k次方过于困难. 这个时候 应该仔细观察一下 和 ...
- bzoj 1907: 树的路径覆盖【贪心+树形dp】
我是在在做网络流最小路径覆盖的时候找到这道题的 然后发现是个贪心+树形dp \( f[i] \)表示在\( i \)为根的子树中最少有几条链,\( v[i] \) 表示在\( i \)为根的子树中\( ...
- BZOJ4849[Neerc2016]Mole Tunnels——模拟费用流+树形DP
题目描述 鼹鼠们在底下开凿了n个洞,由n-1条隧道连接,对于任意的i>1,第i个洞都会和第i/2(取下整)个洞间有一条隧 道,第i个洞内还有ci个食物能供最多ci只鼹鼠吃.一共有m只鼹鼠,第i只 ...
- 【bzoj1907】树的路径覆盖 树形dp
题目描述 输入 输出 样例输入 1 7 1 2 2 3 2 4 4 6 5 6 6 7 样例输出 3 题解 树形dp 设f[x]表示以x为根的子树完成路径覆盖,且x为某条路径的一端(可以向上延伸)的最 ...
- 『快乐链覆盖 树形dp』
快乐链覆盖 Description 给定一棵 n 个点的树,你需要找至多 k 条互不相交的路径,使得它们的长度之和最大 定义两条路径是相交的:当且仅当存在至少一个点,使得这个点在两条路径中都出现 定义 ...
- [BZOJ 1907] 树的路径覆盖 【树形DP】
题目链接:BZOJ - 1907 题目分析 使用树形 DP,f[x][0] 表示以 x 为根的子树不能与 x 的父亲连接的最小路径数(即 x 是一个折线的拐点). f[x][1] 表示以 x 为根的子 ...
- AIM Tech Round 3 (Div. 1) (构造,树形dp,费用流,概率dp)
B. Recover the String 大意: 求构造01字符串使得子序列00,01,10,11的个数恰好为$a_{00},a_{01},a_{10},a_{11}$ 挺简单的构造, 注意到可以通 ...
- 初涉树形dp
算是一个……复习以及进阶? 什么是树形dp 树形dp是一种奇妙的dp…… 它的一个重要拓展是和各种树形的数据结构结合,比如说在trie上.自动机上的dp. 而且有些时候还可以拓展到环加外向树.仙人掌上 ...
随机推荐
- Flutter实战视频-移动电商-39.路由_Fluro的路由配置和静态化
39.路由_Fluro的路由配置和静态化 handler只是单个路由的配置,这节课我们要学习路由的整体配置 整体配置 新建routers.dart文件来做整体配置 detailsHandler就是我们 ...
- myeclipse 去掉spring特性支持
myeclipse10.0 去掉spring支持 手工修改工程目录下的.project文件中相关的内容 删除<nature>com.genuitec.eclipse.springfram ...
- 访问web-inf下jsp资源的几种方式
转自:http://blog.csdn.NET/eidolon8/article/details/7050114 方法一: 本来WEB-INF中的jsp就是无法通过地址栏访问的,所以安全. 如果说你要 ...
- TRANSFORM_TEX是做什么的
简单来说,TRANSFORM_TEX主要作用是拿顶点的uv去和材质球的tiling和offset作运算,确保材质球里的缩放和偏移设置是正确的. (v.texcoord就是顶点的uv) 而_MainTe ...
- MongoDb 安装服务 以及 安全配置
安装MongoDb 的服务 命令如下: (cmd以管理员运行) mongod –logpath "D:\Program Files\mongodb\data\logs.txt" – ...
- Java 虚拟机(Java Virtual Machine)
Java 编译器将 Java 程序编译成虚拟机能够识别的二进制代码,这种代码称为字节码(Bytecode).字节码就是虚拟机的机器指令,它与平台无关,有统一的格式,不依赖于具体的硬件环境,只运行在 J ...
- Faster_Rcnn在windows下运行踩坑总结
Faster_Rcnn在windows下运行踩坑总结 20190524 今天又是元气满满的一天! 1.代码下载 2.编译 3.下载数据集 4.下载pre-train Model 5.运行train ...
- PostgreSQL - N''和::bpchar
N''的效果和::bpchar效果类似,都表示定长字符串.比如下边的sql: select n'233' as num; select '233'::bpchar as num; select '23 ...
- Serervlet | 慕课课程实战 | 编写登录逻辑
Users.java package com.po; public class Users { private String username; private String password; pu ...
- 《Python网络爬虫之三种数据解析方式》
引入 回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指 ...