标签:卖出 def nod min while arp push const 贪心
贪心+树形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\n", ans);
}
return 0;
}
标签:卖出 def nod min while arp push const 贪心
原文地址:https://www.cnblogs.com/lesning/p/12452652.html