hdu-6201

árbol codiciosos dp +

En la medida de lo posible bajo comprar, vender caro

Establecer una buena regla de transferencia muy bien

La memoria a largo

dp [i] [1] nodo número I o uno de sus hijos el precio de compra más bajo consideración // depender de peajes

dp [0] nodo número [i] i o uno de sus hijos el precio de venta más alto para ser considerado peaje //

#include <iostream>
# include <cstring>
# include <algoritmo>
#include <vector>
using namespace std;
typedef largo largo ll;
struct nodo {
	int p;
	ll len;
	Node (int a, ll b): p (a), Len (b) {}
};
const int maxN = 2E5 + 7;
vector <Node> G [maxN];
int n;
add vacío (int x, int y, ll len) {
	G [x] .push_back (Node (y, len));
}
ll dp [maxN] [4]; // 1 comprar más pequeños, mayor venta 0
ll ans = 0;
int DFS (int x, int hace) {
	for (int i = 0; i <G [x] .size (); i ++) {
		int p = G [x] [i] .p;
		ll ln = G [x] [i] .LEN;
		si (p == fa) continuar;
		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);
	}
	año = max (años dp [x] [0] - DP [x] [1]);
	return 0;
}
int main () {
	t int;
	scanf ( "% d", & t);
	while (t--) {
		año = 0;
		scanf ( "% d", y n);
		for (int i = 0; i <= n; i ++) {
			G [i] .clear ();
		}
		Int ser, y;
		ll len;
		for (int i = 1; i <= n; i ++) {
			scanf ( "% LLD", y dp [i] [0]);
			dp [i] [1] = dp [i] [0];
		}
		for (int i = 1; i <n; i ++) {
			scanf ( "% d% d% LLD", y ser, y en, y LEN);
			añadir (ser, y, s);
			añadir (y, BE, s);
		}
		dfs (1, -1);
		printf ( "% LLD \ n", ans);
	}
	return 0;
}

  

Supongo que te gusta

Origin www.cnblogs.com/lesning/p/12452652.html
Recomendado
Clasificación