Pagini recente » Cod sursa (job #234394) | Cod sursa (job #1950423) | Cod sursa (job #2696167) | Cod sursa (job #104454) | Cod sursa (job #889855)
Cod sursa(job #889855)
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
#define NMAX 1001
#define INF 0x3f3f3f3f
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n, m, Fmax;
vector<bool> s;
vector<int> t;
queue<int> Q;
vector<int> g[NMAX];
int F[NMAX][NMAX];
int C[NMAX][NMAX];
bool BF( int nod );
void MaxFlow( );
int main()
{
int a, b, c;
fin >> n >> m;
t.resize( n + 1 );
for( int i = 1; i <= m; ++i )
{
fin >> a >> b >> c;
g[a].push_back( b );
g[b].push_back( a );
C[a][b] = c;
}
MaxFlow();
fout << Fmax << '\n';
fin.close();
fout.close();
return 0;
}
bool BF( int nod )
{
// vector<bool> s(n + 1, false);
int x;
s.assign( n + 1, false);
Q.push( nod );
s[nod] = true;
while( !Q.empty() )
{
x = Q.front();
Q.pop();
if( x == n )
continue;
for( vector<int>::iterator it = g[x].begin(); it != g[x].end(); ++it)
{
if( s[*it] )
continue;
if( C[x][*it] > F[x][*it] )
{
Q.push( *it );
s[*it] = true;
t[*it] = x;
}
}
}
return s[n];
}
void MaxFlow( )
{
for ( int Fmin = 0; BF( 1 );)
{
// det Fmin
for( vector<int>::iterator it = g[n].begin(); it != g[n].end(); ++it )
{
t[n] = *it;
if( !s[*it])
continue;
if( C[t[n]][n] > F[t[n]][n] )
{
Fmin = INF;
for( int i = n; i != 1; i = t[i] )
Fmin = min( Fmin, C[t[i]][i] - F[t[i]][i] );
if( Fmin == 0 )
continue;
// marim fluxul
for( int i = n; i != 1; i = t[i] )
F[t[i]][i] += Fmin, F[i][t[i]] -= Fmin;
Fmax += Fmin;
}
}
}
}