CF1292C El ataque de Xenon contra las pandillas

Titulo

 

Entrada

La primera línea contiene un número entero n (2≤n≤3000), el número de pandillas en la red.

Cada una de las siguientes n − 1 líneas contiene enteros ui y vi (1≤ui, vi≤n; ui ≠ vi), lo que indica que hay un vínculo directo entre las pandillas ui y vi.

Se garantiza que los enlaces se coloquen de tal manera que cada par de pandillas se conecte exactamente por una ruta simple.

salida

Imprima el valor máximo posible de S: el número de capas de contraseña en la red de pandillas.

Ejemplos

Entrada

3
1 2
2 3

Salida

3

Entrada

5
1 2
1 3
1 4
3 5

Salida

10

Nota

 

Titulo

Para n nodos, n-1 aristas no dirigidas. Eso es un arbol. Necesitamos asignar 0 ~ n-2 valores únicos a estos n-1 bordes. mex (u, v) representa el número entero no negativo más pequeño que no aparece en los pesos de borde que pasan del nodo u al nodo v. Calcule el valor máximo de la siguiente ecuación

 

Análisis

 De acuerdo con la fórmula anterior, se puede llegar a una conclusión, es decir, siempre que se considere la contribución de cada lado, cada lado debe tener una contribución.

Supongamos que encontramos el resultado de una cadena como 1-2-3-4, entonces si ya conocemos sus sub-resultados, los resultados de 1-2-3 y 2-3-4, necesitamos derivar 1-2- 3-4 resultados, luego de acuerdo con nuestro análisis, se agregan de 1-2-3 y 2-3-4 a 1-2-3-4 al producto de los dos extremos de la cadena 1-2-3-4 (Es decir, cuántas cadenas en este árbol pueden cubrir esta cadena, todas pueden obtener esta bonificación), ya que el valor agregado es el mismo, entonces definitivamente elija la más grande de las dos. El número es muy simple: para la cadena de x -...- y, el número de puntos en el lado de x es el número de puntos en el subárbol con y como raíz yx como vértice del subárbol. Solo dicho num [root] [u] num [root] [u] num [root] [u] puede obtenerse, y 1-2-3 y 2-3-4 pueden obtenerse usando fa [root] [ u] fa [raíz] [u] fa [raíz] [u], también para la cadena x -...- y, fa [x] [y] fa [x] [y] fa [x] [y ] Es el punto directamente conectado a y en la cadena x -...- y.

Código

#include <cstdio> 
#include <cstring> 
#include <vector> 
#include <stack> 
#include <algorithm> 
#include <iostream>
 usando el  espacio de nombres std;
#define ll largo largo
 #define rep (i, a, b) para (int i = a; i <= b; i ++)
 #define per (i, a, b) for (int i = a; i> = b ; i--)
 #define inf 0x3f3f3f3f
 const  int MAXN = 3e3 + 5 ; 
vector < int > v [MAXN]; 
ll fa [MAXN] [MAXN], num [MAXN] [MAXN], dp [MAXN] [MAXN], raíz; 
nulo dfs ( int u,int f) { 
    num [raíz] [u] = 1 ;
    int len = v [u] .size (); 
    rep (i, 0 , len- 1 ) {
         int y = v [u] [i];
        si (y == f) continúa ; 
        fa [raíz] [y] = u; 
        dfs (y, u); 
        num [raíz] [u] + = num [raíz] [y]; 
    } 
} 
resolveré ( int x, int y) {
     if (x == y) devuelve  0 ;
    if (dp [x] [y]) devuelve dp [x] [y];
    return dp [x] [y] = num [x] [y] * num [y] [x] + max (resolver (x, fa [x] [y]), resolver (y, fa [y] [x ])); 
} 
int main () 
{ 
    ios :: sync_with_stdio ( false ); 
    cin.tie ( 0 );
    int n, x, y;
    while (cin >> n) { 
        rep (i, 1 , n) v [i] .clear (); 
        memset (fa, 0 , sizeof (fa)); 
        memset (num, 0 , sizeof (num)); 
        memset (dp, 0 , sizeof (dp)); 
        rep (i, 1 , n- 1) { 
            cin >> x >> y; 
            v [x] .push_back (y); 
            v [y] .push_back (x); 
        } 
        rep (i, 1 , n) { 
            raíz = i; 
            dfs (i, - 1 ); 
        } 
        ll ans = 0 ; 
        rep (i, 1 , n) { 
            rep (j, i + 1 , n) { 
                ans = max (ans, resolver (i, j)); 
            } 
        } 
        cout << ans << endl; 
    } 
    return  0; 
}

 

 

 

Supongo que te gusta

Origin www.cnblogs.com/Vocanda/p/12679570.html
Recomendado
Clasificación