Pagini recente » Cod sursa (job #9520) | Cod sursa (job #2315199) | Cod sursa (job #2126251) | Cod sursa (job #2092991) | Cod sursa (job #671297)
Cod sursa(job #671297)
#include<fstream>
#include<vector>
#include<bitset>
#include<queue>
#define DIM 1001
#define INF 0x3f3f3f3f
#define pb push_back
#define FOR(g, it) \
for( vector< int > :: iterator it = g.begin(); it != g.end(); ++it )
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int N, M, flux = 0;
int C[DIM][DIM], F[DIM][DIM], t[DIM];
vector< int > G[DIM];
bitset<DIM> viz;
void Read()
{
int i;
int x, y, c;
in >> N >> M;
for(i = 1; i <= M; i++)
{
in >> x >> y >> c;
G[x].pb(y);
G[y].pb(x);
C[x][y] = c;
}
}
int BFs()
{
queue< int > Q;
viz.reset();
Q.push(1);
viz.set(1);
vector< int > :: iterator it;
int nod;
while( !Q.empty() )
{
nod = Q.front();
Q.pop();
if( nod == N ) continue;
FOR( G[nod], it )
{
if( C[nod][*it] != F[nod][*it] && !viz[*it] )
{
viz.set(*it);
Q.push(*it);
t[*it] = nod;
}
}
}
return viz[N];
}
void Solve()
{
int fmin = INF;
while( BFs() )
FOR(G[N], it)
{
int nod = *it;
if( C[nod][N] == F[nod][N] || !viz[nod] ) continue;
t[N] = nod;
fmin = INF;
for(nod = N; nod != 1; nod = t[nod] )
fmin = min( fmin, C[t[nod]][nod] - F[t[nod]][nod] );
if ( !fmin ) continue;
for(nod = N; nod != 1; nod = t[nod] )
{
F[t[nod]][nod] += fmin;
F[nod][t[nod]] -= fmin;
}
flux += fmin;
}
}
int main()
{
Read();
Solve();
out << flux;
}