Titulo:
Análisis:
Esto es un poco demasiado simple. Dfs procesa Dp [i], Son [i], Deep [i], Val [i] dos veces (respectivamente, la suma de las profundidades de todos los subárboles de i cuando toma 1 como raíz, tomando 1 como raíz El número de nodos en el subárbol i, cuando i es la raíz, cuando es la profundidad, cuando es la raíz) está bien, y luego puede encontrarlo en Val, complejidad n, pasar directamente. El límite de tiempo de esta pregunta es de 10000 ms, sí, es de 10000 ms, tal vez el nlogn con una constante más pequeña pueda pasar, por supuesto, parece que no se usa.
Código:
#include <cstdio> const int maxn = 1000000 + 10 ; struct E { int to; int siguiente; E () { a = siguiente = 0 ; } } ed [maxn * 2 ]; int cabeza [maxn]; int tot; nulo J ( int a, int b) { tot ++ ; ed [tot] .to = b; ed [tot] .next = head [a]; cabeza [a] = tot; } int De [maxn]; int er [maxn]; largo largo Dp [maxn]; int n; largo largo val [maxn]; largo largo ans; nulo Dfs1 ( int x, int fa) { De [x] = De [fa] + 1 ; Dp [x] = De [x]; for ( int i = head [x]; i; i = ed [i] .next) { if (ed [i] .to == fa) continuar ; Dfs1 (ed [i] .to, x); er [x] + = er [ed [i] .to] + 1 ; Dp [x] + = Dp [ed [i] .to]; } } anular Dfs2 ( int x, int fa) { if (x == 1 ) val [x] = Dp [x]; de lo contrario val [x] = Dp [x] - (( largo largo ) De [x] - ( largo largo ) 1 ) * (( largo largo ) er [x] + ( largo largo ) 1 ) + val [fa] - Dp [x] + (( largo largo ) De [x] - ( largo largo ) 2 ) * (( largo largo) er [x] + ( largo largo ) 1 ) + ( largo largo ) n- ( largo largo ) er [x] - ( largo largo ) 1 ; // 多 转转 para ( int i = head [x]; i; i = ed [i] .next) if (ed [i] .to! = Fa ) Dfs2 (ed [i] .to, x); } int main () { scanf ( " % d " , & n); int js1, js2; para ( int i = 1 ; i <= n- 1 ; i ++ ) { scanf ( " % d% d " , & js1, & js2); J (js1, js2); J (js2, js1); } Dfs1 ( 1 , 0 ); ans = Dp [ 1 ]; Dfs2 ( 1 , 0 ); int js = 1 ; para ( int i = 1 ; i <= n; i ++ ) { if (val [i]> ans) { ans = val [i]; js = i; } } printf (" % d " , js); devuelve 0 ; }