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