hdu-6201

Posted lesning

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu-6201相关的知识,希望对你有一定的参考价值。

贪心+树形dp

尽可能低价买入,高价卖出

设好转移规律就好了

长记性

dp[i][1] i号节点或者他的某个子孙中最低买入价格//要靠考虑路费

dp[i][0] i号节点或者他的某个子孙中最高卖出价格//要考虑路费

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
struct Node {
	int p;
	ll len;
	Node(int a, ll b):p(a), len(b) {}
};
const int maxn = 2e5 + 7;
vector<Node>G[maxn];
int n;
void add(int x, int y,ll len) {
	G[x].push_back(Node(y,len));
}
ll dp[maxn][4];//1买要小,0卖要大
ll ans = 0;
int dfs(int x, int fa) {
	for (int i = 0; i < G[x].size(); i++) {
		int p = G[x][i].p;
		ll ln = G[x][i].len;
		if (p == fa) continue;
		dfs(p, x);
		dp[x][1] = min(dp[x][1], dp[p][1] + ln);
		dp[x][0] = max(dp[x][0], dp[p][0] - ln);
	}
	ans = max(ans, dp[x][0] - dp[x][1]);
	return 0;
}
int main() {
	int t;
	scanf("%d", &t);
	while (t--) {
		ans = 0;
		scanf("%d", &n);
		for (int i = 0; i <= n; i++) {
			G[i].clear();
		}
		int be, en;
		ll len;
		for (int i = 1; i <= n; i++) {
			scanf("%lld", &dp[i][0]);
			dp[i][1] = dp[i][0];
		}
		for (int i = 1; i < n; i++) {
			scanf("%d%d%lld", &be, &en, &len);
			add(be, en, len);
			add(en, be, len);
		}
		dfs(1, -1);
		printf("%lld
", ans);
	}
	return 0;
}

  

以上是关于hdu-6201的主要内容,如果未能解决你的问题,请参考以下文章

HDU 6201 transaction transaction transaction DFS 图论

HDU 6201 transaction transaction transaction(拆点最长路)

HDU 6201 2017沈阳网络赛 树形DP或者SPFA最长路

hdu 6201 transaction (最短路变形——带负权最长路)

HDU - 6201 transaction transaction transaction(spfa求最长路)

hdu6201 transaction transaction transaction(from 2017 ACM/ICPC Asia Regional Shenyang Online)