P3376 【模板】网络最大流
#include <vector>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int maxn= 210 , maxm= 5010 ;
long long inf= 1e18 ;
int n, m, s, t;
struct edge{
int to, cap, rev;
} ;
vector< edge> G[ maxn] ;
int level[ maxn] ;
int iter[ maxn] ;
void add_edge ( int from, int to, int cap) {
G[ from] . push_back ( { to, cap, G[ to] . size ( ) } ) ;
G[ to] . push_back ( { from, 0 , G[ from] . size ( ) - 1 } ) ;
}
void bfs ( ) {
memset ( level, - 1 , sizeof level) ;
queue< int > q;
level[ s] = 0 ;
q. push ( s) ;
while ( q. size ( ) ) {
int v= q. front ( ) ; q. pop ( ) ;
for ( int i= 0 ; i< G[ v] . size ( ) ; i++ ) {
edge & e= G[ v] [ i] ;
if ( e. cap> 0 && level[ e. to] < 0 ) {
level[ e. to] = level[ v] + 1 ;
q. push ( e. to) ;
}
}
}
}
long long dfs ( int v, long long f) {
if ( v== t) return f;
for ( int & i= iter[ v] ; i< G[ v] . size ( ) ; i++ ) {
edge & e= G[ v] [ i] ;
if ( e. cap> 0 && level[ v] < level[ e. to] ) {
long long d= dfs ( e. to, min ( f, ( long long ) e. cap) ) ;
if ( d> 0 ) {
e. cap- = d;
G[ e. to] [ e. rev] . cap+ = d;
return d;
}
}
}
return 0 ;
}
long long max_flow ( ) {
long long flow= 0 ;
while ( true ) {
bfs ( ) ;
if ( level[ t] < 0 ) return flow;
memset ( iter, 0 , sizeof iter) ;
long long f;
while ( ( f= dfs ( s, inf) ) > 0 ) {
flow+ = f;
}
}
}
int main ( ) {
scanf ( "%d%d%d%d" , & n, & m, & s, & t) ;
for ( int i= 1 ; i<= m; i++ ) {
int x, y, w;
scanf ( "%d%d%d" , & x, & y, & w) ;
add_edge ( x, y, w) ;
}
printf ( "%lld\n" , max_flow ( ) ) ;
}