Pagini recente » Istoria paginii monthly-2014/runda-9/clasament | Cod sursa (job #768543) | Cod sursa (job #1335441) | Cod sursa (job #1803663) | Cod sursa (job #2380846)
#include <bits/stdc++.h>
#define vecin v [ nod ][ i ]
using namespace std ;
const int NR = 1005 ;
const int oo = 110005 ;
ifstream in ("maxflow.in") ;
ofstream out ("maxflow.out") ;
vector < int > v [ NR ] ;
int n , m , x , y , c , d [ NR ][ NR ] , TT [ NR ] , pos , flow , sol ;
bool viz [ NR ] ;
bool bfs () {
int i , nod ;
queue < int > q ;
for ( i = 1 ; i <= n ; ++ i ) TT [ i ] = 0 , viz [ i ] = 0 ;
q.push( 1 ) ;
viz [ 1 ] = 1 ;
while ( !q.empty() && !viz [ n ] ) {
nod = q.front() ;
q.pop() ;
viz [ nod ] = 1 ;
for ( size_t i = 0 ; i < v [ nod ].size() ; i ++ ) {
if ( !viz [ vecin ] && d [ nod ][ vecin ] > 0 ) {
TT [ vecin ] = nod ;
viz [ vecin ] = 1 ;
q.push( vecin ) ;
}
}
}
return viz [ n ] ;
}
int main () {
in >> n >> m ;
while ( m -- ) {
in >> x >> y >> c ;
v [ x ].push_back( y ) ;
v [ y ].push_back( x ) ;
d [ x ][ y ] = c ;
}
while ( bfs () ) {
for ( size_t i = 0 ; i < v [ n ].size() ; i ++ ) {
if ( viz [ v [ n ][ i ] ] && d [ v [ n ][ i ] ][ n ] > 0 ) {
pos = n ;
flow = oo ;
while ( TT [ pos ] ) {
flow = min ( flow , d [ TT [ pos ] ][ pos ] ) ;
pos = TT [ pos ] ;
}
sol += flow ;
pos = n ;
while ( TT [ pos ] ) {
d [ TT[ pos ] ][ pos ] -= flow ;
d [ pos ][ TT[ pos ] ] += flow ;
pos = TT [ pos ] ;
}
}
}
}
out << sol ;
}