POJ2152 Fire (树形DP)
题意:n个城市n-1条边 组成一棵树 在每个城市修建消防站会有一个花费costi
每个城市能防火当且仅当地图上距离他最近的消防站距离小于di
问如何修建消防站 使地图上所有的城市都有预防火灾的能力
题解: 这个题太难了..... 完全不会
具体来说就是用dp[i][j]表示在处理i这个城市的时候在j城市修消防站
如果dis i,j > di 那么表示这样修不合法就让dp[i][j] = INF
如果合法这样就已经确定了两个状态
那么我们同样采用先递归再回溯更新的方法 用ans[i]表示包含i的这棵子树已经处理好的最小值
那么回溯时肯定是由他的儿子转移过来
可以直接更新 dp[i][j] += ans[v] 最后dp[i][j] += costj
但可能有一种重复的情况 即j这个消防站既能保护i也能v
所以这种情况就是dp[i][j] += dp[v][j] - costj 减去重复计算的花费
最后再更新ans[i] = min(dp[i][j])j从1 - n
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
using namespace std;
const int INF = ; int n;
int cost[];
int d[];
int dis[];
int head[];
int ans[];
int dp[][]; struct node
{
int to, nex, val;
}E[]; void dfs1(int x, int fa)
{
int c = head[x];
for(int i = c; i; i = E[i].nex)
{
int v = E[i].to;
if(v == fa) continue;
dis[v] = dis[x] + E[i].val;
dfs1(v, x);
}
} void dfs2(int x, int fa)
{
int c = head[x];
for(int i = c; i; i = E[i].nex)
{
int v = E[i].to;
if(v == fa) continue;
dfs2(v, x);
} dis[x] = ;
dfs1(x, -); for(int i = ; i <= n; i++)
{
if(dis[i] > d[x])
{
dp[x][i] = INF;
continue;
} for(int j = c; j; j = E[j].nex)
{
int vv = E[j].to;
if(vv == fa) continue; dp[x][i] += min(ans[vv], dp[vv][i] - cost[i]);
}
dp[x][i] += cost[i];
}
for(int i = ; i <= n; i++) ans[x] = min(ans[x], dp[x][i]);
} int main()
{
int T;
scanf("%d", &T);
while(T--)
{
memset(dp, , sizeof(dp));
memset(ans, , sizeof(ans));
memset(head, , sizeof(head));
int cnt = ;
scanf("%d", &n);
for(int i = ; i <= n; i++) scanf("%d", &cost[i]);
for(int i = ; i <= n; i++) scanf("%d", &d[i]); for(int i = ; i < n; i++)
{
int u, v, o; scanf("%d%d%d", &u, &v, &o);
E[++cnt].to = v; E[cnt].nex = head[u]; head[u] = cnt; E[cnt].val = o;
E[++cnt].to = u; E[cnt].nex = head[v]; head[v] = cnt; E[cnt].val = o;
} dfs2(, -);
printf("%d\n", ans[]);
}
return ;
}
POJ2152 Fire (树形DP)的更多相关文章
- [poj2152]fire_树形dp
fire poj-2152 题目大意:给出一颗树,给出两个相邻节点的距离,以及每个节点的接受范围,还有当前节点的代价.我们想要求出覆盖整个图的最小代价. 注释:一个点被覆盖,当且仅当该点有防火站或者这 ...
- POJ 2152 Fire(树形DP)
题意: 思路:令F[i][j]表示 的最小费用.Best[i]表示以i为根节点的子树多有节点都找到负责消防站的最小费用. 好难的题... #include<algorithm> #incl ...
- poj2152 Fire(树形DP)
题目链接:https://vjudge.net/problem/POJ-2152 题意:给定一颗大小为n的树,在每个结点建消防站花费为w[i],如果某结点没有消防站,只要在它距离<=d[i]的结 ...
- Fire (poj 2152 树形dp)
Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...
- POJ 2152 Fire (树形DP,经典)
题意:给定一棵n个节点的树,要在某些点上建设消防站,使得所有点都能够通过某个消防站解决消防问题,但是每个点的建站费用不同,能够保证该点安全的消防站的距离上限也不同.给定每个点的建站费用以及最远的消防站 ...
- 树形 DP 总结
树形 DP 总结 本文转自:http://blog.csdn.net/angon823/article/details/52334548 介绍 1.什么是树型动态规划 顾名思义,树型动态规划就是在“树 ...
- 【转】【DP_树形DP专辑】【9月9最新更新】【from zeroclock's blog】
树,一种十分优美的数据结构,因为它本身就具有的递归性,所以它和子树见能相互传递很多信息,还因为它作为被限制的图在上面可进行的操作更多,所以各种用于不同地方的树都出现了,二叉树.三叉树.静态搜索树.AV ...
- 【DP_树形DP专题】题单总结
转载自 http://blog.csdn.net/woshi250hua/article/details/7644959#t2 题单:http://vjudge.net/contest/123963# ...
- 树形dp总结
转自 http://blog.csdn.net/angon823 介绍 1.什么是树型动态规划 顾名思义,树型动态规划就是在"树"的数据结构上的动态规划,平时作的动态规划都是线性的 ...
随机推荐
- NYOJ 496 [巡回赛-拓扑排序]
链接:click here 题意: 巡回赛 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描写叙述 世界拳击协会(WBA)是历史最悠久的世界性拳击组织,孕育了众多的世界冠军, ...
- #pragma pack (n) 惹的祸
今天遇到了一个问题,使用数据流传输的数据在解析的时候数据错位.想了非常久,发现是#pragma pack (n)惹的祸. 首先.解析方使用了编译字节设置,可是在发送方没有使用,于是用相同的结构体解析数 ...
- go7---map
package main /* map 类似其它语言中的哈希表或者字典,以key-value形式存储数据 Key必须是支持==或!=比较运算的类型,不可以是函数.map或slice, 这3中类型都不能 ...
- 10.6 Graph Test
一套图论的练习题,各个方面都有挺好的 第一第二题有一定难度(来源POI),第三第四题比较水 但我并没考好 T1 特工 szp T2 洞穴 zaw T3 最短路 line T4 最小差异值 dvalue
- 【USACO07FEB】 Cow Relays
[题目链接] 点击打开链接 [算法] 朴素算法,就是跑N-1遍floyd 而满分算法就是通过矩阵快速幂加速这个过程 [代码] ...
- .NET 导入导出Excel
第一种方式:OleDb 需要安装office,且读数据慢,而且有数据格式的Cell读出数据不正确等问题.放弃. 第二种方式:NPOI开源库 使用NPOI导入导出Excel应该是.NET开发很常用的手段 ...
- bzoj 1577: [Usaco2009 Feb]庙会捷运Fair Shuttle【贪心+线段树】
按结束时间排序,然后开个线段树,按照排序后的牛群贪心的选 贪心的依据是选哪头牛都是选,不如给后面的多省一点空间 #include<iostream> #include<cstdio& ...
- 清北刷题10.23night
NOIP 模拟赛 张若天 年 ⽉ ⽇ 题⽬名称 监听 实验室 ⽂明 可执⾏⽂件名 monitor lab civilization 输⼊⽂件名 monitor.in lab.in civilizati ...
- robotframework - 测试用例&套件- Settings标签
1.Test Case -- Settings标签截图 2.Test Case Settings 标签说明: Documentation:用于描述用例的一个小文本,它可以把 URL 地址转换为可点击的 ...
- mysql机制总结
Innodb和myisam最大的不同就是 innodb支持事物 采用了行锁 myisam 采用了表锁 默认就使用了表锁 表锁:速度快 并发小 发生锁冲突高 开销小 行锁:速度慢 并发高 发生锁冲突低 ...