enlaces a los temas: http://acm.hdu.edu.cn/showproblem.php?pid=1285
Título dar un poco de orden entre los puntos requeridos para dar un arreglo topológico de la lexicográfico más pequeño. Para el problema de clasificación topológica, tenemos la DFS y BFS se pueden resolver, pero el problema es el DFS sólo puede manejar un nodo y el nodo siguiente capa con relación a la distancia entre la raíz, es decir la profundidad es de entre ellas el orden, para un mismo nivel, no hay orden, pero puede manejar BFS tiene relaciones con la capa, por lo que consideramos recorrido con BFS, y las BFS originales que buscan la clasificación topológica la cola se convierte en una cola de prioridad. Así que podemos seleccionar la prioridad de los nodos lexicográfico más pequeños en cada capa de salida.
Código es el siguiente:
1 #include <bits / STDC ++ h.> 2 usando espacio de nombres std; 3 typedef unsigned int ui; 4 typedef largo largo ll; 5 typedef unsigned largo largo ULL; 6 #define pf printf 7 #define mem (a, b) memset (a, b, sizeof (a)) 8 #define prime1 1E9 + 7 9 #define prime2 1E9 + 9 10 #define pi 3,14159265 11 #define LSON l, mediados, tr << 1 12 #define rson mitad + 1, r, rt << 1 | 1 13 #define Scand (x) scanf ( "% LLF", y x) 14 #define f (i, a, b) for (int i = a; i <= b; i ++) 15 #define de exploración (a) scanf ( "% d", y a) 16 #define pf (a, b) make_pair ((a), (b)) 17 #define P par <int, int> 18 #define dbg (args) cout << # args << ":" << args << endl; 19 #define inf 0x3f3f3f3f 20 const int maxN = 505 ; 21 int n, m, t; 22 inline int leer () { 23 int ans = 0 ,24 Char ch = getchar (); 25 , mientras que (isdigit (ch)!) { Si (CH == ' - ' ) w = - 1 ; ch = getchar ();} 26 mientras que (isdigit (ch)) ans = (ans << 3 ) + (ans << 1 ) + CH- ' 0 ' , CH = getchar (); 27 de retorno ans * w; 28 } 29 struct nodo { 30 int u, v; 31 } p [maxN]; 32 int e; 33 intVIS [MAXN] [MAXN], la cabeza [MAXN], NXT [MAXN], en [MAXN], NUM [MAXN]; // en grados representa el 34 es nulo el init () 35 { 36 E = 0 ; 37 [ MEM (VIS , 0 ); MEM (cabeza, - 1. ); MEM (NXT, - 1. ); MEM ( en , 0 ); 38 es MEM (NUM, 0 ); // la información de clasificación de puesta a cero 39 } 40 void addedge ( int U, int V) 41 es { 42 es P [E] .u = U; 43 es P [E] .v = V; 44 es NXT [E] = cabeza [U]; 45 cabeza [U] = E ++ ; 46 es } 47 void topsort () 48 { 49 El priority_queue < int , Vector < int >, Gran < int >> Q; // montón mínimo 50 F (I, . 1 , n-) 51 es { 52 es SI ( en [I] == 0 ) q.push (I); // el punto de la fila de orden lexicográfico cero en la cola de prioridad 53 es } 54 es int T = 0 , ID;// punto de tráfico de secuencia topsort con las BFS fuera de la cola en realidad debe tener después de la clasificación se completa topsort 55 al mismo tiempo (! Q.empty ()) 56 es { 57 es NUM [T ++] = ID = q.top () ; 58 q.pop (); 59 para ( int I = cabeza [ID]; ~ I; I = NXT [I]) // todos los lados de este punto de escaneo de 60 { 61 está en [P [I]. V] -; // penetración se reduce a un punto 62 es SI ( en [P [I] .v] == 0 ) q.push (P [I] .v); // ser el grado de 0 punto incluido en la cola de prioridad 63 } 64 } 65 //Después de todos los puntos se escanean, ya cierto orden topológico, por lo que la salida directa 66 PF ( " % D " , NUM [ 0 ]); 67 F (I, . 1 , N- . 1 ) PF ( " % D " , NUM [I]); 68 PF ( " \ n- " ); 69 } 70 int main () 71 es { 72 // La freopen ( "input.txt", "R & lt", la entrada estándar); 73 es // El freopen ( "Output .txt "" W", stdout); 74 std :: :: iOS sync_with_stdio ( false ); 75 , mientras que (scanf ( "% D% D " , y n-, y m) =! El EOF) 76 { 77 el init (); 78 int A, B; 79 F (I, . 1 , m) 80 { 81 A = Read (), B = Read () ; 82 IF (VIS [a] [B]!) // asegurarse de que sólo un borde dirigido entre las dos partes, o el grado de acceso va a cambiar, lo que resulta en un error 83 { 84 addedge (a, B); 85 VIS [a] [B] = 1. ; 86 en [B] ++ ; 87 } 88 } 89 topsort (); 90 } 91 92 }