HDU2196 ordenador (clásico árbol-DP)

Significado de las preguntas:

laboratorio original con un ordenador (Nº 1), DD es el nombre del patrocinio py verde y laboratorio más cercano, la compra de ordenadores N-1, N ° 2 a N. Cada ordenador conectado a un ordenador con un cable instalado previamente. Pero la velocidad preocupación escuadra Gangster es demasiado lento, le hice la primera computadora a una longitud máxima de los cables de otros equipos, pero la diversión del nombre DD adicto al verde del perfil de la ciudad olvidó de calcular, ayuda por favor él.

solución:

nmd demasiado duro, voy a arrodillarse

# include <cstdio> 
#include <algoritmo> 
#include <cstring>
 utilizando  espacio de nombres std;
const  int maxN = 1E4 + 100 ;
struct nodo {
     int u, v, w, próximo; 
} borde [maxN * 2 ];
int tol;
int cabeza [maxN * 2 ];
void addedge ( int u, int v, int w) { 
    borde [tol] .u = u; 
    borde [tol] .v = v; 
    borde [tol] .w =  w;
    borde [tol] .Next= Head [U]; 
    cabeza [U] = Tol ++ ; 
} 
int DP [MAXN] [ 3. ];
 // son la máxima positiva, grandes tiempos positivos, el máximo inversa 
int L [MAXN]; 
 int DFS ( int U , int pre) {
     // devuelve una distancia máxima positiva u 
    IF (DP [u] [ 0 ]> = 0 ) volver DP [u] [ 0 ]; 
    DP [u] [ 0 ] DP = [u] [ . 1 ] DP = [U] [ 2 ] = L [U] = 0 ;
     para ( int I = cabeza [U]; I = - 1.; i = borde [i] .A continuación) {
         int v = borde [i] .v;
        si (v == pre) continuar ;
        si (dp [u] [ 0 ] <dfs (v, u) + borde [i] .w) { 
            l [u] = v; 
            dp [u] [ 1 ] = max (dp [u] [ 1 ], dp [u] [ 0 ]); 
            dp [u] [ 0 ] = dfs (v, u) + borde [i] .w; 
        } 
        Demás  si (dp [u] [ 1 ] <dfs (v, u) + borde [i] .w) 
            dp [u] [ 1 ] = max (dp [u] [ 1 ], dfs (v, u) + borde [i] .w);
    }
     regreso Dp [u] [ 0 ]; 
} 
Void dfs_again ( int u, int pre) {
     para ( int i = cabeza [u]; i = - 1 ; i = borde [i] .A continuación) {
         int v = borde [i] .v;
        si (v == pre) continuar ;
        si (v == l [U]) 
            dp [v] [ 2 ] = max (dp [u] [ 2 ], dp [u] [ 1 ]) + borde [i] .w;
        más  
            dp [v] [ 2 ] = max (dp [u] [ 2 ], dp [u] [ 0]) + Borde [i] .w; 
        dfs_again (v, u); 
    } 
} 
Int main () {
     int N;
    mientras que (~ scanf ( " % d " , y N)) { 
        tol = 0 ; 
        memset (cabeza, - 1 , sizeof (cabeza)); 
        memset (dp, - 1 , sizeof (dp)); 
        memset (l, - 1 , sizeof (l));
        para ( int i = 2 ; i <= N; i ++ ) {
             intv, w; 
            scanf ( " % d% d " , & v, y w); 
            addedge (i, v, w); 
            addedge (v, i, w); 
        } 
        Dfs ( 1 , - 1 ); 
        dfs_again ( 1 , - 1 );
        para ( int i = 1 ; i <= N; i ++ ) 
            printf ( " % d \ n " , max (dp [i] [ 0 ], dp [i] [ 2 ])); 
    } 
}

 

Supongo que te gusta

Origin www.cnblogs.com/zhanglichen/p/12639679.html
Recomendado
Clasificación