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.什么是树型动态规划 顾名思义,树型动态规划就是在"树"的数据结构上的动态规划,平时作的动态规划都是线性的 ...
随机推荐
- cocos2d-x 求相交矩阵
cocos2d-x有推断矩阵相交的方法 CCRect::intersectsRect(CCRect& rect)但可惜没有提供求两个相交矩阵的方法,我作了总结,代码例如以下: CCRect T ...
- dumpdecrypted进行砸壳
1.下载源码git clone git://github.com/stefanesser/dumpdecrypted/ 2.进行编译生成 dumpdecrypted.dylibmake 3.将dump ...
- linux发行版的用户交互
1 cli,即command line interface 纯命令行的交互方式,该命令行界面是由shell提供的. linux内核本身也自带了一个console,即linux console,它是基于 ...
- gcc的搜索路径,头文件和库
1 抛开默认的搜索路径,自己指定搜索路径 第一,明确自己编写的代码所需要的头文件和库放在了哪里 第二,使用“-I”指定头文件的搜索路径,使用-rpath指定库的搜索路径 2 无论是本地编译还是交叉编译 ...
- Lucas模板&快速幂模板
/* *********************************************** Author :guanjun Created Time :2016/5/20 0:28:36 F ...
- presentModalViewController和dismissModalViewControllerAnimated的使用总结
在实际开发中,如果要弹出视图: 我们常用到presentModalViewController方法和dismissModalViewControllerAnimated方法. presentModal ...
- 4.7.5 Efficient Construction of LALR Parsing Tables
4.7.5 Efficient Construction of LALR Parsing Tables There are several modifications we can make to A ...
- SVN导出指定版本差异文件 ***
当一个项目进入运营维护阶段以后,不会再频繁地更新全部源文件到服务器,这个时间的修改大多是局部的,因此更新文件只需更新修改过的文件,其他 没有修改过的文件就没有必要上载到服务器.但一个稍微上规模的项目文 ...
- Spark SVM分类器
package Spark_MLlib import java.util.Properties import org.apache.spark.mllib.regression.LabeledPoin ...
- 运行Android Studio总是未发现设备
1.未发现虚拟机设备