Dinic algoritmo Valle 3376 prueba de flujo máximo Los

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 }

 

Supongo que te gusta

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