+ Arbre Greedy dp
Dans la mesure du possible acheter bas, vendre haut
Définir une bonne règle de transfert très bien
La mémoire à long
dp [i] [1] numéro i nœud ou un de ses fils l'examen le plus bas du prix d'achat // compter sur les péages
dp [i] [0] noeud i numéro ou un de ses fils le plus haut prix de vente à être considéré comme sans //
#include <iostream> #include <cstring> #include <algorithme> #include <vector> using namespace std; typedef long long ll; struct Node { int p; ll len; Noeud (int a, ll b): p (a), len (b) {} }; const int maxn = 2e5 + 7; vector <Node> G [maxn]; int n; vide add (int x, int y, ll len) { G [x] .push_back (Node (y, x)); } 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; si (p == fa) de continuer; 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 (dp ans, [x] [0] - dp [x] [1]); return 0; } Int main () { int t; scanf ( "% d", et t); tandis que (t--) { ans = 0; scanf ( "% d", et n); pour (int i = 0; i <= n; i ++) { G [i] .clear (); } Int être, en; ll len; pour (int i = 1; i <= n; i ++) { scanf ( "% lld", et dp [i] [0]); dp [i] [1] = dp [i] [0]; } For (int i = 1; i <n; i ++) { scanf ( "% d% d% lld", et être, et en, et LEN); ajouter (être, en, len); ajouter (en, être, seulement); } dfs (1, -1); printf ( "% lld \ n", ans); } return 0; }