poj2152_Fire(树形DP)
来源:互联网 发布:淘宝做客服考试答案 编辑:程序博客网 时间:2024/06/02 04:12
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <vector>#define INF 0x3f3f3f3f#define rep0(i, n) for (int i = 0; i < n; i++)#define rep1(i, n) for (int i = 1; i <= n; i++)#define rep_0(i, n) for (int i = n - 1; i >= 0; i--)#define rep_1(i, n) for (int i = n; i > 0; i--)#define MAX(x, y) (((x) > (y)) ? (x) : (y))#define MIN(x, y) (((x) < (y)) ? (x) : (y))#define mem(x, y) memset(x, y, sizeof(x))#define MAXN 1000 + 10using namespace std;struct Edge{ int from, to, weight; Edge(int f, int t, int w): from(f), to(t), weight(w) {}};int w[MAXN], d[MAXN], dis[MAXN][MAXN], dp[MAXN][MAXN], ans[MAXN];vector<Edge> edges;vector<int> g[MAXN];void init(int n){ edges.clear(); rep1(i, n) g[i].clear(); mem(dis, 0); mem(dp, 0); mem(ans, 0x3f);}void addEdge(int u, int v, int len){ edges.push_back(Edge(u, v, len)); edges.push_back(Edge(v, u, len)); g[u].push_back(edges.size() - 2); g[v].push_back(edges.size() - 1);}void dfs_dis(int root, int u, int fa){ for (int i = 0; i < g[u].size(); i++) { Edge e = edges[g[u][i]]; if (e.to == fa) continue; dis[root][e.to] = dis[e.to][root] = dis[root][u] + e.weight; dfs_dis(root, e.to, u); }}void dfs(int n, int u, int fa){ for (int i = 0; i < g[u].size(); i++) { Edge e = edges[g[u][i]]; if (e.to == fa) continue; dfs(n, e.to, u); } for (int j = 1; j <= n; j++) { if (dis[u][j] > d[u]) { dp[u][j] = INF; continue; } dp[u][j] = w[j]; for (int i = 0; i < g[u].size(); i++) { Edge e = edges[g[u][i]]; if (e.to == fa) continue; dp[u][j] += MIN(ans[e.to], dp[e.to][j] - w[j]); } ans[u] = MIN(ans[u], dp[u][j]); }}int main(){ #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif // ONLINE_JUDGE int t, n, u, v, l; scanf("%d", &t); while (t--) { scanf("%d", &n); init(n); rep1(i, n) { scanf("%d", w + i); } rep1(i, n) scanf("%d", d + i); rep0(i, n - 1) { scanf("%d %d %d", &u, &v, &l); addEdge(u, v, l); } rep1(i, n) dfs_dis(i, i, -1); dfs(n, 1, -1); printf("%d\n", ans[1]); } return 0;}
阅读全文
0 0
- poj2152_Fire(树形DP)
- 树形dp
- 树形DP
- 树形dp
- 树形DP
- 树形dp
- 树形DP
- 树形DP
- 树形DP
- 树形DP
- 树形dp
- 树形dp
- 树形dp
- 树形dp
- 树形DP
- 树形DP
- 树形DP
- 树形DP
- Java8 lamda表达式示例
- handlebars获取json数据(Map对象(与集合处理一样))
- linux 磁盘空间满了如何查找文件
- 1821: [JSOI2010]Group 部落划分 Group
- linklist和arraylist
- poj2152_Fire(树形DP)
- 发邮件-java
- 机器学习基础
- 图片上传
- 使用本地cookie缓存,模拟访问
- 简述window.onload与document.ready()的区别
- 关于redis的一些问题,事物方面,线程,在项目中的应用等几个点
- 划分型DP相关
- opencv使图片变亮