Pagini recente » Cod sursa (job #1922497) | Cod sursa (job #81442) | Cod sursa (job #1206624) | Cod sursa (job #3280461) | Cod sursa (job #2849690)
#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]) ///Nu am folosit nodul si se mai poate pompa
{
T[i] = nod;
Q.push(i);
}
}
return T[D] != 0; ///Se poate ajunge la destinatie
}
int Edmonds_Karp()
{
int flow = 0; ///fluxul
int i, cmin;
while(bfs()) ///cat timp mai exista un drum de ameliorare
{
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]);
}
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 << Edmonds_Karp();
f.close();
g.close();
return 0;
}