hdu1532 la búsqueda de la clasificación topológica utilizando BFS

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 }

 

Supongo que te gusta

Origin www.cnblogs.com/randy-lo/p/12577618.html
Recomendado
Clasificación