poj2152 Fire
好难啊,我弱爆了。
题解看陈启峰的论文。。。
/**
* Problem:POJ2152
* Author:Shun Yao
* Time:2013.9.2
* Result:Accepted
* Memo:TreeDP
*/ #include <cstring>
#include <cstdio>
#include <climits> #define MAXN 1010
#define inf LONG_MAX long n, w[MAXN], d[MAXN], f[MAXN][MAXN], ff[MAXN], dist[MAXN]; long gtot;
class Edge {
public:
long v, w;
Edge *next;
Edge() {}
~Edge() {}
Edge(long V, long W, Edge *ne) : v(V), w(W), next(ne) {}
} *g[MAXN], gg[MAXN << 1]; void add(long x, long y, long w) {
g[x] = &(gg[gtot++] = Edge(y, w, g[x]));
g[y] = &(gg[gtot++] = Edge(x, w, g[y]));
} long min(long x, long y) {
return x < y ? x : y;
} void dis(long x) {
Edge *e;
for (e = g[x]; e; e = e->next)
if (dist[e->v] == -1) {
dist[e->v] = dist[x] + e->w;
dis(e->v);
}
} void dfs(long x, long pa) {
long i;
Edge *e;
for (e = g[x]; e; e = e->next)
if (e->v != pa)
dfs(e->v, x);
memset(dist, -1, sizeof dist);
dist[x] = 0;
ff[x] = inf;
dis(x);
for (i = 1; i <= n; ++i)
if (dist[i] > d[x])
f[x][i] = inf;
else {
f[x][i] = w[i];
for (e = g[x]; e; e = e->next)
if (e->v != pa)
f[x][i] += min(ff[e->v], f[e->v][i] - w[i]);
ff[x] = min(ff[x], f[x][i]);
}
} int main() {
static long T, i, j, u, v, l; #ifndef ONLINE_JUDGE
freopen("poj2152.in", "r", stdin);
freopen("poj2152.out", "w", stdout);
#endif scanf("%ld", &T);
while (T--) {
scanf("%ld", &n);
for (i = 1; i <= n; ++i)
scanf("%ld", w + i);
for (i = 1; i <= n; ++i)
scanf("%ld", d + i);
gtot = 0;
for (i = 1; i <= n; ++i)
g[i] = 0;
for (i = 1; i < n; ++i) {
scanf("%ld%ld%ld", &u, &v, &l);
add(u, v, l);
}
dfs(1, 0);
printf("%ld\n", ff[1]);
} fclose(stdin);
fclose(stdout);
return 0;
}
poj2152 Fire的更多相关文章
- POJ2152 Fire 【树形dp】
题目链接 POJ2152 题解 经典老题,还真暴力 \(n \le 1000\),所以可以\(O(n^2)\)做 所以可以枚举每个点依附于哪一个点 设\(f[u]\)表示以\(u\)为根的子树的最小代 ...
- poj2152 Fire(树形DP)
题目链接:https://vjudge.net/problem/POJ-2152 题意:给定一颗大小为n的树,在每个结点建消防站花费为w[i],如果某结点没有消防站,只要在它距离<=d[i]的结 ...
- POJ-2152 Fire (树形DP)
题目大意:在一棵树中选出一些点,选每个点的代价为w(i),并且对于点 i ,在距离它lim(i)之内必须选一个点,使它作为 i 的依赖点.求最小代价. 题目分析:定义状态dp(u,k)表示使u为根节点 ...
- POJ2152 Fire (树形DP)
题意:n个城市n-1条边 组成一棵树 在每个城市修建消防站会有一个花费costi 每个城市能防火当且仅当地图上距离他最近的消防站距离小于di 问如何修建消防站 使地图上所有的城市都有预防火灾的能力 ...
- [SOJ #498]隔膜(2019-10-30考试)/[POJ2152]Fire
题目大意:有一棵$n$个点的带边权树,第$i$个点有两个值$w_i,d_i$,表示在这个点做标记的代价为$w_i$,且这个点距离$d_i$以内至少要有一个点被标记,为最小代价.$n\leqslant6 ...
- 【POJ2152】Fire
题目大意:给定一棵 N 个节点的无根树,点有点权,边有边权,现需要选出一个点集,满足树上任意一个点到该点集的距离不超过该点的给定值,求选出点集点权的最小值是多少. 题解:可以发现,对于以 i 为根的子 ...
- POJ 2152 fire / SCU 2977 fire(树型动态规划)
POJ 2152 fire / SCU 2977 fire(树型动态规划) Description Country Z has N cities, which are numbered from 1 ...
- [poj2152]fire_树形dp
fire poj-2152 题目大意:给出一颗树,给出两个相邻节点的距离,以及每个节点的接受范围,还有当前节点的代价.我们想要求出覆盖整个图的最小代价. 注释:一个点被覆盖,当且仅当该点有防火站或者这 ...
- 关于SequeezeNet中的Fire Module
在论文<SQUEEZENET: ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND <0.5MB MODEL SIZE>中,作者 ...
随机推荐
- 李洪强iOS开发本人集成环信的经验总结_06_发送好友请求
李洪强iOS开发本人集成环信的经验总结_06_发送好友请求 同步好友请求 异步好友请求
- POJ 1879 Tempus et mobilius Time and motion 队列和栈
很简单的队列和栈的应用,不过读明白题意非常重要:(直接引用白书的题解)三个轨道,一个库.分别是分钟单位的轨道,5min单位的轨道,一小时单位的轨道,还有就是n容量的库.每过一分钟,一个小球从库里面出来 ...
- Google Code Style
Google开源项目的代码遵循的规范,见这,C++, OC. PS: vim的配色编辑用户主目录下的.vimrc即可.
- 《 UNIX网络编程》源码的使用
学习编程这东西,看代码,改代码,运行代码这样才能学到实际东西!本书说在www.unpbook.com可以获取源码,不过打不开!所以google unpv13e.tar.gz 并在网络上找到了:源码:h ...
- day 2014-04-13
crystal 10:00:40 米多爸爸 11:51:47 很滋润嘛.一般有送股题材的股票都会在送股消息公告之前炒上一阵子,真到了题材兑现就涨不动了,也有些会在除权后走一波填权行情.现在不是牛市,后 ...
- CentOS升级git
1.首先查看下当前的版本 [root@localhost ~]# git --versiongit version 1.8.2.1 2.尝试进行升级 [root@localhost ~]# yum u ...
- 八大Webkit内核浏览器
列举出时下最流行的Webkit内核浏览器,所以我们并不会做出评测和对比.PS:本文列举的浏览器有一部分为IE+Webkit双核浏览器,如果您对其他IE内核浏览器很感兴趣<抛弃数据!用体验和感觉告 ...
- poj 1265 Area( pick 定理 )
题目:http://poj.org/problem?id=1265 题意:已知机器人行走步数及每一步的坐标 变化量 ,求机器人所走路径围成的多边形的面积.多边形边上和内部的点的数量. 思路:1.以 ...
- Java [leetcode 9] Palindrome Number
问题描述: Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could n ...
- Hessian介绍
Hessian是什么 Hessian类似Web Service,是一种高效简洁的远程调用框架. Hessian的主页:http://hessian.caucho.com/ 有关网上的对Hess ...