Escape de HDU 4857 (figura construido inversa topológica de clasificación +)

escape

Tiempo límite: 2000/1000 MS (Java / Otros) Límite de memoria: 32768/32768 K (Java / Otros)
sumisión total (s): 11873 admitirá la presentación (s): 3278

Descripción del problema
Malo te suceda, y ahora todo el mundo está ocupado con sus vidas. Pero el canal de escape es muy estrecha, sólo podemos alineación.

Hay numeral n individuo de 1 a n. Mientras que algunas limitaciones extrañas, cada uno de la forma: b una condición necesaria antes.
Al mismo tiempo, la desigualdad social, los pobres, algunos ricos, algunas de estas personas. El más rico 1, No. 2 segundos rico, y así sucesivamente. El rico para sobornar a la persona a cargo, por lo que tienen algunos beneficios.

Los líderes pueden ahora organizar el orden alineamos pendiente de recibir los beneficios, así que dejó el N º 1 en el ranking tanto como sea posible, si en este momento hay una gran variedad de situaciones, se deja Nº 2 lo más adelante, si hay una gran variedad de situaciones, dejar que No.3 hacia delante, y así sucesivamente.

A continuación, han dispuesto que el orden. Garantizamos solvencia.
 

Entrada

Una primera línea de número entero T (1 <= T <= 5), indica el número de datos de prueba.
Entonces para cada uno de los datos de prueba, una primera línea de dos enteros n (1 <= n <= 30000) y m (1 <= m <= 100 000), respectivamente, y el número representa el número de restricciones.

Entonces m líneas de dos enteros A y B, representan el número b debe ser un número antes de una restricción. A y B deben ser diferentes.
 

Salida

, Separado para cada línea de salida de datos de prueba secuencialmente con cola espacio.
 

Ejemplo de entrada

1 5 10 3 5 1 4 2 5 1 2 3 4 1 4 2 3 1 5 3 5 1 2
 

Ejemplo de salida

1 2 3 4 5
 
tema de análisis
El problema inicialmente se pensó directamente en una prioridad de la cola de clasificación topológica en la línea, pero WA, leer explicaciones de los demás llegó a entender diferente este título y orden de diccionario, es requisito para cumplir con la premisa de las relaciones m, por lo que el número 1 hacia delante, entonces esto permite No. 2 .... y así más adelante posible sobre la base de la clasificación topológica si, cola de prioridad directa con un valor mínimo, a continuación, el pop-up, N ° 1 no se puede garantizar lo más adelante, por ejemplo, 6> 3 -> 1 y 5-> 4-> 2, la salida de este método es 542631, es evidente 631 532 es correcto
Por lo que nuestra estrategia debe ser encontrar el punto 1, se debe poner por delante de él se emiten, a continuación, encontrar 2 puntos, y debe ser clasificado por delante de él se emiten, y así sucesivamente, que se ordena por la cola, Por lo tanto, utilizar una construcción de mapas inversa
Con el fin de asegurar que el punto frontal 1 2, la cola de prioridad puede ser utilizado para expulsar un punto grande
Finalmente salida inversa
#include <bits / STDC ++ h.> usando espacio de nombres std; 
priority_queue < int > q; 
vector < int > mp [ 30005 ];
int n, m, t, i, ahora, a, b, en [ 30.005 ], ANSS [ 30005 ], cnt;
int main () 
{ 
    ios :: sync_with_stdio ( falsa );  // 不写会TLE 
    cin >> t;
    mientras que (t-- ) 
    { 
        memset (en, 0 , sizeof (en)); 
        memset (mp, 0 , sizeof

 (punto de fusión)); 
        memset (ANSS, 0 , sizeof (ANSS)); 
        cnt = 0 ; 
        cin >> n >> m;
        mientras que (M-- ) 
        { 
            cin >> a >> b; 
            mp [b] .push_back (a); 
            en [a] ++ ; 
        } 
        Para (i = 1 ; i <= n; i ++ ) 
        { 
            si (en [i] == 0 ) 
            { 
                q.push (i); 
            } 
        } 
        Int flag = 1;
        mientras que (! q.empty ()) 
        { 
            Ahora = q.top (); 
            ANSS [cnt ++] = ahora; 
            q.pop (); 
            para (i = 0 ; i <mp [ahora] .size (); i ++ ) 
            { 
                en [mp [ahora] [i]] - ;
                si (en [mp [ahora] [i]] == 0 ) 
                { 
                    q.push (pf [ahora] [i]); 
                } 
            } 
        } 
        Para (i = CNT- 1 ; i> = 1 ; i-- ) 
        {
            cout << ANSS [i] << '  ' ; 
        } 
        Cout << ANSS [ 0 ] << endl; 
    } 
}

 

Supongo que te gusta

Origin www.cnblogs.com/dyhaohaoxuexi/p/12544390.html
Recomendado
Clasificación