HDU 6201 树形DP 或 最长路
来源:互联网 发布:长沙淘宝仓库打包招聘 编辑:程序博客网 时间:2024/05/21 09:06
简略题意:
每条边有一个权值,代表走这条路的花费。问从任意一点购买,在任意一点卖出的最高收益是多少。
解法
所有节点再连向终点,权值为
#include <bits/stdc++.h>using namespace std;typedef long long LL;const int maxn = 110000;int t;int n;int val[maxn];vector<pair<int, int>> G[maxn];int dp[maxn];int dis[maxn];int vis[maxn];void init() { for(int i = 0; i < maxn; i++) G[i].clear(); memset(dp, 0x3f3f3f3f, sizeof dp); memset(dis, -0x3f3f3f3f, sizeof dis); memset(vis, 0, sizeof vis);}void spfa() { dis[0] = 0; vis[0] = 1; queue<int> q; q.push(0); while(!q.empty()) { int u = q.front(); q.pop(); vis[u] = 0; for(int i = 0; i < G[u].size(); i++) { int v = G[u][i].first, w = G[u][i].second; if(dis[v] < dis[u] + w) { dis[v] = dis[u] + w; if(!vis[v]) { q.push(v); vis[v] = 1; } } } }}int main() { scanf("%d", &t); while(t--) { init(); scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%d", &val[i]); G[0].push_back({i, -val[i]}); G[i].push_back({n+1, val[i]}); } for(int i = 1; i < n; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); G[u].push_back({v, -w}); G[v].push_back({u, -w}); } spfa(); cout<<dis[n+1]<<endl; } return 0;}
解法
显然这是一棵树,最优的答案必然是一个父亲节点到一个儿子节点,因此跑树形DP即可。
对于
显然
答案即为
#include <bits/stdc++.h>using namespace std;typedef long long LL;const int maxn = 110000;int t;int n;int val[maxn];vector<pair<int, int>> G[maxn];int dp[maxn];void init() { for(int i = 0; i < maxn; i++) G[i].clear(); memset(dp, 0x3f3f3f3f, sizeof dp);}void dfs1(int u, int fa) { dp[u] = -val[u]; for(int i = 0; i < G[u].size(); i++) { int v = G[u][i].first; int w = G[u][i].second; if(v == fa) continue; dfs1(v, u); } for(int i = 0; i < G[u].size(); i++) { int v = G[u][i].first; int w = G[u][i].second; if(v == fa) continue; dp[u] = max(dp[u], dp[v] - w); }}void dfs2(int u, int fa, int w) { if(fa != -1) { dp[u] = max(dp[u], dp[fa] - w); } for(int i = 0; i < G[u].size(); i++) { int v = G[u][i].first; if(v == fa) continue; dfs2(v, u, G[u][i].second); }}int main() { scanf("%d", &t); while(t--) { init(); scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &val[i]); for(int i = 1; i < n; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); G[u].push_back({v, w}); G[v].push_back({u, w}); } dfs1(1, -1); dfs2(1, -1, 0); int ans = 0; for(int i = 1; i <= n; i++) ans = max(ans, dp[i]+val[i]); cout<<ans<<endl; } return 0;}
阅读全文
0 0
- HDU 6201 树形DP 或 最长路
- 【转】HDU 6201 树形DP 或 最长路
- HDU 6201 transaction transaction transaction【树形DP||SPFA最长路】
- hdu 2196树形dp经典 树的最长路
- 树形DP HDU 6201
- hdu 6201 树形DP
- HDU 6201 树形DP
- HDU 6201 树形dp
- HDU 6201transaction 【树形DP】
- 树中最长路径 树形DP HDU 3534 Tree
- HDU 2196 树形DP + 节点到达的最长距离
- hdu 1224 最长路+dp
- Hdu 2196 Computer (树的直径 或 树形DP)
- HDU 1520 Anniversary party(DFS或树形DP)
- HDU-6201 transaction transaction transaction(树形dp)
- hdu 6201 transaction transaction transaction 树形dp
- hdu2196树形dp求任一点的最长路
- 树形dp hdu Computer
- Android多线程机制
- win7_不主动发送智能卡命令
- js计算出现多位小数-Javascript 浮点运算问题分析与解决
- Runtime浅析
- 性能优化系列之fragment的懒加载
- HDU 6201 树形DP 或 最长路
- Linux基础命令
- GoF:(Gang of Four,GOF设计模式)---四人组
- 区块链架构与应用(区块链入门篇)
- jQuery Mobile学习笔记(一)——移动平台
- JavaScript 常用55个技巧
- Optimizing Rule Placement in Software-Defined Networks for Energy-aware Routing
- (六)redis常用数据类型 SortedSet
- 杂记——喵哥吃鱼的问题