[Bzoj4472] [árbol DP] Vendedor

título

dirección original

comentario

Basta con leer esta pregunta todavía se siente un buen lío, podría entonces el cerebro no está despierto, una vez más, a recuperar la sensación de Tarjan. Por supuesto, usted debe encontrar finalmente DP con un árbol.

(De aquí en adelante DP [u] U representantes a la raíz de la ganancia máxima entre ellos el propio sub-árbol, bool g [u] u representa el número de programas y sub-árbol es único, único y 0 en caso contrario 1, t [u] representa el número de u, v [u] representa el valor de u)

Calcular la ganancia máxima es realmente muy simple. Un poco como hace antes de clases con aire acondicionado , pero más que una serie de restricciones y negativas, pero no es difícil de tratar. T tiempo de cálculo debido a que cada hijo u debe regresar después de la llegada de volver a la raíz, lo que sólo puede se ordenan los valores dp hijo, antes de seleccionar t [u] -1 meses, e inmediatamente dejar de experimentar negativo desde entonces la opción único negativo por el valor total se hace más pequeño.

Por lo tanto el programa como el tratamiento que es único?

Abrimos una gama bool u g representa el número de su programa de sub-árbol es único. Obviamente, sólo el número de programas en las siguientes tres condiciones no es única:

Un hijo dp adquirido valor0 (elección no puede votar)

El hijo hizo un g valor de 1(Hay diferentes caminos en el sub-árbol zheke)

La próxima elección no es el hijo y el hijo del último seleccionado f valores son los mismos (se puede sustituir) (que escribí cuando descuidado este punto, pero sigue siendo una, y sobre los datos demasiado débil)

Luego, a partir de la raíz de forma recursiva de nuevo en él, oh, última dp visto [1] yg [1] en él.

(Parte realmente no quiere venir a la práctica con referencia hermano mayor DZN, gracias ~)

 código

1 #include <bits / STDC ++ h.>
 2  usando  espacio de nombres std;
3  const  int maxN = 100000 + 5 , Inf = 2147483647 ;
4 inline int leer () {
 5     int s = 0 , w = 1 ;
6     Char ch = getchar ();
7     , mientras que (ch < ' 0 ' || ch> ' 9 ' ) { Si (CH == ' - ' ) w = - 1 ; ch =getchar ();}
 8     mientras que (ch> = ' 0 ' && ch <= ' 9 ' ) s = s * 10 + CH- ' 0 ' , CH = getchar ();
9     retorno s * w;
10  }
 11  int n, cabeza [maxN], tot, v [maxN], t [maxN], dp [maxN];
12  bool g [maxN];
13  struct nodo {
 14      int a, próximo;
15 } e [ 2 * maxN];
16  vacío Añadir ( int a, int b) {
17      e [tot] .a = b;
18      e [tot] .Next = cabeza [a];
19      cabeza [a] = tot;
20      tot ++ ;
21  }
 22  void dfs ( int x, int FA) {
 23      priority_queue <par < int , int >> q; // 按照dp值大小排序
24      para ( int i = cabeza [x]; i; i = e [i] .A continuación) {
 25          int v = e [i] .a;
26          si (v == fa) siguen ;
27          dfs (v, x);
28          q.push (la make_pair (DP [V], V));
 29      }
 30      int num = 0 , SUM = 0 , el juez = 0 ;
 31 es      el tiempo (q.empty () && NUM <T [X] - 1. ) {
 32          IF (. q.top () primero < 0 ) PAUSA ; // arrastre ocurre inmediatamente detener 
33 es          SI (q.top () == Primera. 0 {) // 0 realización descrita no es 1,
 34          / / y 0 detrás ya sea 0 o negativa, no puede contribuir, directamente de vuelta 
35              Juez = 1. ;
 36              PAUSA ;
 37 [          }
38 es          SUM + = Q.top () Primera;.
 39          IF ([. Q.top () SEGUNDO] G == . 1 ) Juez = 1. ;
 40          q.pop ();
 41 es          NUM ++ ;
 42 es      }
 43 es      DP [X] = SUMA + V [X];
 44 es      G [X] = Juez;
 45  }
 46 es  int main () {
 47      = TOT 1. ;
 48      T [ 1. = Inf]; // atención a su hogar puede tener numerosos 
49      n = Read () ;
 50      para ( int I = 2; i <= n; i ++) v [i] = read ();
51      para ( int i = 2 ; i <= n; i ++) t [i] = read ();
52      para ( int i = 1 ; i <= n- 1 ; i ++ ) {
 53          int x, y;
54          x = read (); y = read ();
55          ADD (x, y);
56          Agregar (y, x);
57      }
 58      dfs ( 1 , 0 );
59      printf ( " % d \ n " , dp [ 1 ]);
60      si(g [ 1 ]) printf ( " solución no es única " );
61      otra cosa printf ( " solución es única " );
62      de retorno  0 ;
63 }
Ver código

Afortunadamente, incluso sagrados, canciones a blog canto.

Supongo que te gusta

Origin www.cnblogs.com/DarthVictor/p/12633732.html
Recomendado
Clasificación