Disuasión estratégica 51nod plantear preguntas de prueba grupales

Canal de corriente alterna

 

Fondo del tema

El coronel Mauregliano Bundia lanzó su guerra número 32. Le deseamos suerte.

Descripción del título

Hay n ciudades cerca de Macondo, y hay n-1 carreteras de dos vías que conectan estas ciudades. El coronel quería disuadir a las autoridades destruyendo dos carreteras. Pero el maestro del coronel le dijo que, por motivos estratégicos, las dos carreteras no deben tener una ciudad común. El efecto disuasorio de esta operación en las autoridades será igual al producto de la longitud de los dos caminos. Suponga que la longitud de cada camino es igual a 1, y que la longitud del camino es igual al número de caminos. Ayude al coronel a causar la mayor disuasión.

Formato de entrada

Conjunto único de datos de prueba. La primera línea es un número entero n (2≤n≤200), donde n es el número de ciudades cercanas a este Macondo. Luego, la línea n-1 es la información del camino, cada línea es dos enteros ai, bi, son el número de la ciudad, lo que indica que hay un camino directamente conectado entre ai y bi. (1≤ai, bi≤n) .

Formato de salida

El mayor rendimiento disuasorio

Muestra de entrada y salida

Muestra de entrada y salida

Ingrese # 1
4 
1 2 
2 3 
3 4
Salida n. ° 1
1
Ingrese # 2
2 
2 1
Salida # 2
0 0
Ingrese # 3
6 
1 2 
2 3 
2 4 
5 4 
6 4
Salida # 3
4 4

Instrucciones / Consejos

Para el 35% de los datos, n <= 10 Para el 75% de los datos, n <= 100 Para el 100% de los datos, n <= 200

 

La idea es muy simple: enumere directamente cada lado y elimínelo para formar dos árboles, y encuentre el diámetro del árbol utilizando los puntos fijos en ambos lados como puntos de partida.

???

Entonces, ¿por qué es esto correcto?

Considera esto:

La pregunta requiere que no haya intersecciones en el camino y que la longitud sea lo más grande posible.

Para la condición 2, es fácil pensar en encontrar el diámetro del árbol. Para la condición 1, se puede simular así:

Para hacer el camino lo más largo posible, es necesario caminar tantos lados como sea posible. Entonces, ¿cuál es la mejor manera?

Mantenga los dos caminos lo más cerca posible. En este caso, ¿cuáles son los dos puntos que no están muy lejos?

Dos puntos finales de un borde. Por lo tanto, desconecte este borde para evitar el cruce y luego encuentre el diámetro de cada árbol en ejecución.

 

Arma de CA:

 

#include <bits / stdc ++. h> usando el  espacio de nombres std;
 #define N 1010
 #define ll long long / * Divide
 un borde y divídelo en dos árboles, encuentra el diámetro de los dos árboles * / 
inline int read () {
     int x = 0 , s = 1 ;
     char c = getchar ();
     while (! Isdigit (c)) {
         if (c == ' - ' ) s = -1 ; 
        c = getchar (); 
    } while (isdigit (c) ) { 
        x = (x << 1

 

    ) + (x << 3 ) + (c ^ ' 0 ' ); 
        c = getchar (); 
    } 
    devolver x * s; 
} 

nodo estructura {
     int u, v;
    int siguiente; 
}Tennesse]; 
int f [N];
bool vis [N];
int dp [N];
int ans = 0 , temp = 0 , temp1 = 0 ; 

int bian = 0 ; 
inline void add ( int u, int v) { 
    t [++ bian] .u = u; 
    t [bian] .v = v; 
    t [bian] .next = f [u]; 
    f [u] = bian;
    volver ; 
} 

Void dfs ( int ahora) {
     para ( int i = f [ahora]; i; i = t [i] .A continuación) {
         int v = t [i] .v, u = t [i] .u;
        if (! vis [v]) { 
            vis [v] = 1 ; 
            dfs (v); 
            temp = max (temp, dp [u] + dp [v] + 1 ); 
            dp [u] = max (dp [u], dp [v] +1 ); 
        } 
    } 
    return ;    
} 

int main () {
 //     freopen ("terrorize.in", "r", stdin);
//     freopen ("terrorize.out", "w", stdout); 
    int n = leer ();
    para ( int i = 1 ; i <= n - 1 ; i ++ ) {
         int x = read (), y = read (); 
        sumar (x, y); 
        sumar (y, x); 
    } 
    para ( int i = 1 ; i <= bian; i + = 2 ) { 
        memset (vis, 0 ,tamaño de (vis)); 
        memset (dp, 0 , sizeof (dp));
        int v = t [i] .v, v2 = t [i + 1 ] .v; 
        vis [v] = vis [v2] = 1 ; 
        temp1 = temp = 0 ; 
        dfs (v); 
        temp1 = temp; 
        temp = 0 ; 
        dfs (v2); 
        ans = max (ans, temp * temp1); 
    } 
    cout << ans << endl;
    devuelve  0 ; 
}

 

 

Supongo que te gusta

Origin www.cnblogs.com/wondering-world/p/12759795.html
Recomendado
Clasificación