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 ])); } }