zoukankan      html  css  js  c++  java
  • 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
    非上上智,不了了心。
  • 相关阅读:
    探讨GTK+应用程序的优化方法
    X Window研究笔记(9)
    X Window研究笔记(10)
    X Window研究笔记(7)
    用gdbserver调试共享库(改进版)
    X Window研究笔记(11)
    Gtkminimo中的几个BUG
    编译基于DirectFB的Phoneme(Advance)
    X Window研究笔记(8)
    X Window研究笔记(12)
  • 原文地址:https://www.cnblogs.com/Lazer2001/p/7148795.html
Copyright © 2011-2022 走看看