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