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 }