hdu1532 bordo problema de flujo máximo

enlaces a los temas: http://acm.hdu.edu.cn/showproblem.php?pid=1532

Título dado de fuente puntual y el drenaje, y algunos bordes, requiere el flujo máximo entre una fuente y un drenaje, solía Edmonds Karp algoritmo es un algoritmo de Ford-Fulkerson se implementa, el algoritmo es el residual clave tecnología en el reverso de la red y la red restante, lo que equivale a la estrategia de búsqueda de una oportunidad de "volver", el proceso de implementación del algoritmo siempre está buscando una fuente a la trayectoria de la fuga aumentar, tamaño de la secuencia se calcula cada vez para encontrar un camino para acumular hasta que no pueda encontrar una trayectoria de aumento. la práctica general está mirando para aumentar caminos BFS, el número de iteraciones con DFS palabras puede ser muy grande, muy tasa de consumo. En Edmonds Karp camino algoritmo de aumento una vez que las operaciones de búsqueda consume O (| E |) tiempo en O (| V || E |} después de flujo de aumento máxima se puede encontrar, por lo que el tiempo algoritmo Edmonds Karp complejidad es sobre O (| V || E | ^ 2), la complejidad del número de casos en el lado es muy alta, hay otros como el algoritmo de flujo máximo Dinic, algoritmo de ISAP, esta vez voy a escribir de una EdmondsKarp algoritmo.

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 = 1,005 ;
21  int n, m, t;
22 inline int leer () {
 23      int ans = 0 ,24      Char CH = getchar ();
 25      el tiempo (isdigit (CH)!) { IF (CH == ' - ' ) = W - 1. ; CH = getchar ();}
 26 es      el tiempo (isdigit (CH)) ANS = ( << ANS 3. ) + (ANS << 1. ) + CH-, ' 0 ' , CH = getchar ();
 27      de retorno ANS * W;
 28  }
 29  int G [MAXN] [MAXN], pre [MAXN]; // g array aquí no sólo sostiene el borde delantero de la información restante tiene más información de la red 
30  int BFS ( int el src, int fregadero)
 31 es {
 32      int Flow [MAXN];
 33 es      MEM (pre, - 1. );
 34 es      Flow [el src] = INF; pre [el src] = 0 ; // cada vez que un flujo infinito de agua que sale de la fuente 
35       de cola < int > Q; q.push (la src);
 36       el tiempo (! q.empty ())
 37 [       {
 38 es           int U = q.front ();
 39           q.pop ();
 40           SI (U == fregadero) PAUSA ; // alcanza la fuga 
41 es          F (I, . 1 , n-)
 42 es          {
 43 es              SI(I = src && Pre [I] == - . 1 && G [T] [I]> 0 ) // encontrar un no una fuente pero no visitado y hay lado de los nodos del punto actual 
44 es              {
 45                  pre [I] = u;
 46 es                  q.push (i);
 47                  Flow [i] = min (Flow [u], G [u] [i]); // tamaño actualizado después del punto i sea el tamaño de un lado de la fuente o un precursor cuanto menor es el valor del nodo 
48              }
 49          }
 50      }     
 51 es      SI (pre [fregadero] == - 1. ) de retorno - 1. ; // fuga no se busca 
52 es      el retorno de flujo [fregadero]; 
 53 es  } 
 54 es int MaxFlow ( int el src, int fregadero)
 55  {
 56 es      int Maxflow = 0 ;
 57 es      el tiempo ( 1. )
 58      {
 59          int Flow = BFS (el src, lavabo);
 60          IF (Flow == - . 1 ) PAUSA ;
 61 es          int CUR = fregadero; // punto de inicio desde el desagüe, paso rollback fuente a paso, la red actualiza el residuo 
62 es          el tiempo (CUR =! el src)
 63 es          {
 64              int Padre = pre [CUR];
 65             G [Padre] [CUR] - = Flow; // desde el nodo padre a la trayectoria de flujo para reducir el nodo actual de flujo de 
66              G [CUR] [Padre] + = Flow; // desde el nodo actual al nodo padre un residual aumenta de flujo entre 
67              CUR = Padre; // actualización de nuevo participan en la red 
68          }
 69          Maxflow + = flujo;
 70      }
 71 es      retorno Maxflow;
 72  }
 73 es  int main ()
 74  {
 75      // el freopen ( "input.txt" , "R & lt", stdin);
 76      // La freopen ( "output.txt", "W", stdout); 
77      std :: :: iOS sync_with_stdio ( false );
78      , mientras que (scanf ( " % d% d " , & m, y n) =! EOF)
 79      {
 80          mem (g, 0 );
81          int u, v, w;
82          f (i, 1 , m)
 83          {
 84              U = read (), v = read (), w = read ();
85              g [u] [v] + = w;
86          }
 87          pf ( " % d \ n " , Maxflow ( 1 , n));
88      }
 89  
90 }

 

Supongo que te gusta

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