YBT高效进阶网络流求最大流
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const long long N= 210 , E= 10010 ;
long long head[ N] , to[ E] , nxt[ E] , val[ E] , dep[ N] , cur[ N] , t, n, tot= 1 ;
bool vis[ N] ;
void add ( long long u, long long v, long long w)
{
to[ ++ tot] = v, val[ tot] = w, nxt[ tot] = head[ u] , head[ u] = tot;
return ;
}
long long BFS ( long long s)
{
long long i, u;
queue< long long > que;
memset ( dep, 0 , sizeof ( dep) ) ;
memset ( vis, 0 , sizeof ( vis) ) ;
for ( i= 1 ; i<= n; i++ ) cur[ i] = head[ i] ;
for ( dep[ s] = 1 , que. push ( s) ; que. size ( ) ; que. pop ( ) )
for ( i= head[ u= que. front ( ) ] ; i; i= nxt[ i] )
if ( val[ i] && ! dep[ to[ i] ] )
{
dep[ to[ i] ] = dep[ u] + 1 ;
if ( ! vis[ to[ i] ] )
vis[ to[ i] ] = 1 , que. push ( to[ i] ) ;
}
return dep[ t] ;
}
long long DFS ( long long x, long long flow)
{
long long ans= 0 , sum;
if ( x== t) return flow;
for ( long long & i= cur[ x] ; i&& ans< flow; i= nxt[ i] )
if ( val[ i] && dep[ x] + 1 == dep[ to[ i] ] && ( sum= DFS ( to[ i] , min ( flow- ans, val[ i] ) ) ) )
ans+ = sum, val[ i] - = sum, val[ i^ 1 ] + = sum;
if ( ans< flow) dep[ x] = 0 ;
return ans;
}
long long Dinic ( long long s)
{
long long ans;
for ( ans= 0 ; BFS ( s) ; ans+ = DFS ( s, 0x7f7f7f7f ) ) ;
return ans;
}
int main ( )
{
long long m, s, u, v, w, i;
for ( scanf ( "%lld%lld" , & m, & n) , s= 1 , t= n, i= 1 ; i<= m; ++ i)
scanf ( "%lld%lld%lld" , & u, & v, & w) , add ( u, v, w) , add ( v, u, 0 ) ;
printf ( "%lld\n" , Dinic ( s) ) ;
return 0 ;
}