Pagini recente » Cod sursa (job #1892263) | Cod sursa (job #2785008) | Istoria paginii runda/sim/clasament | Cod sursa (job #1974772) | Cod sursa (job #2810406)
#include <iostream>
#include <queue>
#include <fstream>
#include <climits>
#define N 1002
using namespace std;
int n, m, st, dr, cost;
int matriceFlux[N][N], tata[N], grafRezidual[N][N], fluxul_maxim = 0, flux_curent, tata_curent;
bool bfsFlux()
{
bool vizitat[N] = {false};
queue <int> coada;
coada.push(1);
vizitat[1] = true;
tata[1] = -1;
while(!coada.empty())
{
int nod_curent = coada.front();
for (int i = 1; i <= n; i++)
if (vizitat[i] == false && grafRezidual[nod_curent][i] > 0)
{
if (i == n)
{
tata[i] = nod_curent;
return true;
}
coada.push(i);
tata[i] = nod_curent;
vizitat[i] = true;
}
coada.pop();
}
return false;
}
int main()
{
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
fin >> n >> m;
for (int i = 1; i <= m; i++)
{
fin >> st >> dr >> cost;
matriceFlux[st][dr] = cost;
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
grafRezidual[i][j] = matriceFlux[i][j];
while (bfsFlux() == true)
{
flux_curent = INT_MAX;
for (int v = n; v != 1; v = tata[v])
{
tata_curent = tata[v];
flux_curent = min(flux_curent, grafRezidual[tata_curent][v]);
}
for (int v = n; v != 1; v = tata[v])
{
tata_curent = tata[v];
grafRezidual[v][tata_curent] += flux_curent;
grafRezidual[tata_curent][v] -= flux_curent;
}
fluxul_maxim += flux_curent;
}
fout << fluxul_maxim;
fin.close();
fout.close();
return 0;
}