Sta, la solución

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

 

Supongo que te gusta

Origin www.cnblogs.com/wish-all-ac/p/12684658.html
Recomendado
Clasificación