Pagini recente » Cod sursa (job #2573927) | Cod sursa (job #172303) | Cod sursa (job #296147) | Cod sursa (job #1222628) | Cod sursa (job #2887129)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define pb push_back
using namespace std;
ifstream f ( "maxflow.in" );
ofstream g ( "maxflow.out" );
const int NMAX = 1001, INF = 0x3f3f3f3f;
int N, M, S, D,
C[NMAX][NMAX],
F[NMAX][NMAX],
T[NMAX];
vector<int>G[NMAX];
void citire()
{
int x, y;
f >> N >> M;
while ( M-- )
{
f >> x >> y;
f >> C[x][y];
G[x].pb ( y );
G[y].pb ( x );
}
}
bool bfs()
{
queue <int> Q;
for ( int i = 1; i <= N; i++ )
T[i] = 0;
T[S] = -1;
Q.push ( S );
bool ok = 0;
while ( !Q.empty() )
{
int nod = Q.front();
Q.pop();
for ( int &i : G[nod] )
if ( T[i] == 0 && C[nod][i] > F[nod][i] ) ///Nu am folosit nodul si se mai poate pompa
{
if ( i != D )
{
T[i] = nod;
Q.push ( i );
}
else ok = 1;
}
}
return ok;
}
int EdKaD()
{
int flow = 0; ///fluxul
int i, cmin;
while ( bfs() ) ///cat timp mai exista un drum de ameliorare
for ( int &nod : G[D] )
if ( T[nod] && C[nod][D] > F[nod][D] )
{
T[D] = nod;
cmin = INF; ///calculam minimul dintre capacitatile ramase de pe drum
for ( i = D; i != S; i = T[i] )
{
cmin = min ( cmin, C[T[i]][i] - F[T[i]][i] );
}
if ( cmin <= 0 )
continue;
for ( i = D; i != S; i = T[i] )
{
F[T[i]][i] += cmin; ///adaugam minimul la fluxul de pe arcele de pe drum
F[i][T[i]] -= cmin; ///scadem minimul de pe arcele inverse
}
flow += cmin; ///adaugam minimul la flux
}
return flow;
}
int main()
{
citire();
S = 1;
D = N;
g << EdKaD();
f.close();
g.close();
return 0;
}