enlaces a los temas: https://www.luogu.com.cn/problem/P3376
el blog de referencia: https://www.cnblogs.com/SYCstudio/p/7260613.html
algoritmo de flujo máximo Dinic, basado en algoritmos EdmondsKarp junto con el concepto de BFS gráfico jerárquicas, haciendo que aumenta más la dirección, y en un DFS puede encontrar un número de trayectorias de aumento, la complejidad del algoritmo es O (| E | * | V | ^ 2 veces), pero la velocidad del algoritmo es en realidad más compleja que la teoría de las veces se describe a ser rápido. Pensamiento Dinic algoritmo es tal que, para cada punto, si tiene tiempo un muchos, a continuación, puede pasar a cada rama para llevar a cabo una búsqueda de una trayectoria de aumento, más que desde el punto de empezar desde cero src aumentada. Cada vez que un DFS volverán al punto actual después de la rama, la rama ahora se puede gastar para actualizar el tamaño de este flujo, se reducirá el flujo siguiente rama disponibles.
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, rt << 1 12 #definerson mediados + 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 0x7ffffff 20 inline int read () { 21 int ans = 0 , w = 1 ; 22 Char ch = getchar (); (! isdigit (ch)) { Si (CH == ' - ' ) w = - 1 ; ch = getchar ();} 24 mientras que (isdigit (ch)) ans = (ANS << 3 ) + (ans << 1 ) + CH- ' 0 ' , CH = getchar (); 25 de retorno ans * w; 26 } 27 28 const int maxN = 1e5 + 10 ; 29 int n, m, s, t; 30 int cnt = 0 ; 31 int cabeza [maxN], NXT [maxN * 10 ], d [maxN]; 32 struct nodo { 33 int v, w; 34 } p [maxN * 10 ]; 35 int e; 36 void addedge ( int u, int v, int w) 37 { 38 p [e] .v = v; 39 p [e] .w = w; 40 NXT [e] = cabeza [u]; 41 cabeza [u] = e ++ ; 42 } 43 bool BFS ( int src, int fregadero) // 确定BFS序 44 { 45 MEM (D, 0 ); 46 es D [el src] = 1. ; 47 Queue < int > Q; 48 q.push (la src); 49 el tiempo (! Q.empty ()) 50 { 51 es int CUR = Q. Frente (); 52 es q.pop (); 53 es para ( int I = cabeza [CUR]; ~ I; I = NXT [I]) 54 es { 55 int V = P [I] .v; 56 es SI (D! [V] && P [I] .W) // determinar el punto de referencia no es, y no está de vuelta bordes 57 { 58 d [v] = d [cur] + 1 ; 59 q.push (v); 60 } 61 } 62 } 63 Si (d [fregadero]) de retorno verdadera ; 64 de retorno falsa ; 65 } 66 int dfs ( int s, int flujo) 67 { 68 si (s == t) de retorno de flujo; 69 int utiliza = 0 ; 70 para (int I = cabeza [S]; ~ I; I = NXT [I]) 71 es { 72 int V = P [I] .v, W = P [I] .W; 73 es SI (D [V] == D [S] + . 1 && W> 0 ) // de acuerdo con la idea algoritmo Dinic, sólo puede ir hacia delante, BFS borde fin de primer año 74 { 75 int tmp = DFS (V, min (Flow Usados, W)); 76 IF (tmp> 0 ) 77 { 78 P [I] .w- = tmp; // actualiza el flujo hacia adelante y los bordes laterales de flujo inverso, 79 P [I ^ 1. ] .W + = tmp; // n el borde es par, su correspondiente reverso es el lado delantero 1 80 + = Tmp utilizados; // fluya desde un punto de partida es las necesidades de caudal que ser actualizado pasado la mayor parte de flujo, 81 IF (Usado Flow ==) PAUSA ; 82 } 83 } 84 } 85 de retorno usados; 86 } 87 int Dinic () 88 { 89 int ANS = 0 ; 90 al mismo tiempo (BFS (S, T)) 91 es { 92 ANS + = DFS (S, INF); 93 } 94 de retorno SNA; 95 } 96 int main () 97 { 98 // freopen ( "input.txt", "r", la entrada estándar); 99 // freopen ( "output.txt", "w", stdout); 100 std :: ios :: sync_with_stdio ( falso ); 101 n = read (), m = read (), S = read (), T = read (); 102 mem (cabeza, - 1 ); mem (NXT, - 1 ); 103 int u, v, w; 104 f (i, 1 , m) 105 { 106 U = read (), v = read (), w = read (); 107 addedge (u, v, w); addedge (v, u, 0 ); 108 } 109 int Maxflow = Dinic (); 110 pf ( " % d \ n " , Maxflow); 111 }