OIer-Dinic

 1 class Network  {
 2 private :
 3     struct edge  {
 4         int to, w, nxt ;
 5         edge ( ) {        }
 6         edge ( int to, int w, int nxt ) : to ( to ), w ( w ), nxt ( nxt ) {        }  
 7     } g [M << 1] ;
 8 
 9     int head [N], cur [N], ecnt ;
10     int S, T, n, dep [N], q [N] ;
11 
12     inline int dfs ( int u, int a )  {
13         if ( u == T || ! a )  return a ;
14         int flow = 0, v, f ;
15         for ( int& i = cur [u] ; i ; i = g [i].nxt )  {
16             v = g [i].to ;
17             if ( dep [v] == dep [u] + 1 )  {
18                 f = dfs ( v, std :: min ( g [i].w, a - flow ) ) ;
19                 g [i].w -= f, g [i ^ 1].w += f ;
20                 flow += f ;
21                 if ( a == flow )  return a ;
22             }
23         }
24         if ( ! flow )  dep [u] = -1 ;
25         return flow ;
26     }
27 
28     inline bool bfs ( int S, int T )  {
29         memset ( dep, 0, sizeof ( int ) * ( n + 1 ) ) ;
30         dep [S] = 1 ;
31         register int fr ( 0 ), tl ( 0 ) ;
32         q [++ tl] = S ;
33         while ( fr ^ tl )  {
34             int u = q [++ fr] ;
35             for ( register int i = head [u] ; i ; i = g [i].nxt )  {
36                 int& v = g [i].to ;
37                 if ( g [i].w &&  ! dep [v] )  {
38                     dep [v] = dep [u] + 1 ;
39                     q [++ tl] = v ;
40                 }
41             }
42         }
43         return dep [T] ;
44     }
45 public :
46     Network ( )  {    ecnt = 1 ; }
47 
48     inline void add_edge ( int u, int v, int w )  {
49         g [++ ecnt] = edge ( v, w, head [u] ) ;     head [u] = ecnt ;
50         g [++ ecnt] = edge ( u, 0, head [v] ) ;     head [v] = ecnt ;
51     }
52 
53     int dinic ( int S, int T, int n )  {
54         this -> S = S, this -> T = T, this -> n = n ;
55         int rt = 0, f ;
56         while ( bfs ( S, T ) )    {
57             memcpy ( cur, head, sizeof ( int ) * ( n + 1 ) ) ; 
58             while ( ( f = dfs ( S, oo ) ) )  rt += f ;
59         }
60         return rt ;
61     }
62 } Lazer ;
Dinic

 

posted @ 2017-07-11 08:36  Lazer2001  阅读(160)  评论(0编辑  收藏  举报