Pagini recente » Cod sursa (job #993372) | Arhiva de probleme | Cod sursa (job #110937) | Cod sursa (job #403652) | Cod sursa (job #2849686)
#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 );
while ( !Q.empty() )
{
int nod = Q.front();
Q.pop();
for ( int &i : G[nod] )
if ( T[i] == 0 && C[nod][i] > F[nod][i] )
{
T[i] = nod;
Q.push ( i );
}
}
return T[D] != 0;
}
int Edmonds_Karp()
{
int flow = 0;
int i, cmin, dif;
while ( bfs() )
{
cmin = INF;
for ( i = D; i != S; i = T[i] )
{
dif = C[T[i]][i] - F[T[i]][i];///capacitatea reziduala pe muchia curenta
if ( dif < cmin )
cmin = dif;
}
for ( i = D; i != S; i = T[i] )
{
F[T[i]][i] += cmin;
C[i][T[i]] -= cmin;
}
flow += cmin;
}
return flow;
}
int main()
{
citire();
S = 1;
D = N;
g << Edmonds_Karp();
f.close();
g.close();
return 0;
}