Pagini recente » Rating Arteni Mihai (MihaiA1) | Profil RaileanuDaria | Profil RaresMatei | Monitorul de evaluare | Cod sursa (job #1301086)
/*
* Code by Spiromanul
* X-MAS Edition
* MERRY X-MAS TO EVERYONE
*/
#include <fstream>
#include <bitset>
#include <vector>
#include <queue>
const char IN [ ] = "maxflow.in" ;
const char OUT [ ] = "maxflow.out" ;
const int MAX = 1111 ;
#define pb push_back
using namespace std;
ifstream fin ( IN ) ;
ofstream fout ( OUT ) ;
vector < int > gr [ MAX ] ;
int cap [ MAX ] [ MAX ] , did [ MAX ] [ MAX ] , tata [ MAX ] ;
bitset < MAX > viz ;
inline bool BFS ( int n ) ;
int main( )
{
int n , m ;
fin >> n >> m ;
for ( ; m ; -- m )
{
int x , y , cost ;
fin >> x >> y >> cost ;
cap [ x ] [ y ] += cost ;
gr [ x ].pb ( y ) ;
gr [ y ].pb ( x ) ;
}
int flux = 0 ;
for ( ; BFS ( n ) ; )
{
for ( auto x : gr [ n ] )
{
if ( cap [ x ] [ n ] == did [ x ] [ n ] or viz [ x ] == 0 ) continue ;
tata [ n ] = x ;
int local = 1 << 30 ;
for ( int j = n ; j != 1 ; j = tata [ j ] )
local = min ( local , cap [ tata [ j ] ] [ j ] - did [ tata [ j ] ] [ j ] ) ;
if ( ! local ) continue ;
for ( int j = n ; j != 1 ; j = tata [ j ] )
{
did [ tata [ j ] ] [ j ] += local ;
did [ j ] [ tata [ j ] ] -= local ;
}
flux += local ;
}
}
fout << flux ;
return 0;
}
inline bool BFS ( int n )
{
queue < int > Q ;
Q.push ( 1 ) ;
viz.reset ( ) ;
viz [ 1 ] = 1 ;
for ( ; !Q.empty ( ) ; )
{
int fata = Q.front ( ) ;
Q.pop ( ) ;
if ( fata == n )
continue ;
for ( auto x : gr [ fata ] )
{
if ( cap [ fata ] [ x ] == did [ fata ] [ x ] or viz [ x ] ) continue ;
viz [ x ] = 1 ;
tata [ x ] = fata ;
Q.push ( x ) ;
}
}
return viz [ n ] ;
}