Pagini recente » Cod sursa (job #2159189) | Cod sursa (job #657526) | Cod sursa (job #2852812) | Cod sursa (job #1610468) | Cod sursa (job #2122076)
#include <fstream>
#include <iostream>
#include <queue>
#include <cstring>
#include <vector>
#define nmax 1005
using namespace std;
ofstream fout ("maxflow.out");
ifstream fin ("maxflow.in");
int n,m,parent[nmax],flux[nmax][nmax],cap[nmax][nmax],nod,a,b,c,fluxtotal,ok,aux,mini,i;
vector < int > w[nmax];
inline void bfs( int S , int D )
{
queue < int > q;
q.push( S );
memset( parent , 0 , sizeof( parent ) );
parent[ S ] = -1;
while( q.size() )
{
aux = q.front();
q.pop();
for( auto it : w[ aux ] )
{
if( flux[ aux ][ it ] == cap[ aux ][ it ] )
continue;
if( parent[ it ] == 0 && it != D )
{
parent[ it ] = aux;
q.push( it );
}
else if( it == D )
ok = 1;
}
}
}
void dinitz( int S , int D )
{
do
{
ok = 0;
bfs( S , D );
for( auto it : w[ D ] )
{
mini = 1e9;
if( parent[ it ] && cap[ it ][ D ] > flux[ it ][ D ] )
parent[ D ] = it;
else
continue;
for( nod = D ; nod != S ; nod = parent[ nod ] )
mini = min( mini , cap[ parent[ nod ] ][ nod ] - flux[ parent[ nod ] ][ nod ] );
for( nod = D ; nod != S ; nod = parent[ nod ] )
{
flux[ parent[ nod ] ][ nod ] += mini;
flux[ nod ][ parent[ nod ] ] -= mini;
}
fluxtotal += mini;
}
} while( ok );
}
int main()
{
fin>>n>>m;
for( i = 1 ; i <= m ; i++ )
{
fin>>a>>b>>c;
cap[ a ][ b ] = c;
w[ a ].push_back( b );
w[ b ].push_back( a );
}
dinitz( 1 , n );
fout<<fluxtotal<<'\n';
}