Pagini recente » Cod sursa (job #1151669) | Cod sursa (job #934828) | Cod sursa (job #2491349) | Cod sursa (job #1521395) | Cod sursa (job #2955885)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
vector<vector<int>> v(1001);
int n, m, x, y, z, fluxMax;
int c[5005][5005], F[5005][5005], tata[1001], viz[1001], cc[5001];
int BFS()
{
cc[0] = cc[1] = 1;
memset(viz, 0, sizeof(viz));
viz[1] = 1;
for (int i = 1; i <= cc[0]; i++)
{
int nod = cc[i];
if (nod == n)
continue;
for (int j = 0; j < v[nod].size(); j++)
{
int vecin = v[nod][j];
if (c[nod][vecin] == F[nod][vecin] || viz[vecin])
continue;
viz[vecin] = 1;
cc[++cc[0]] = vecin;
tata[vecin] = nod;
}
}
return viz[n];
}
int main()
{
f >> n >> m;
for (int i = 1; i <= m; i++)
{
f >> x >> y >> z;
v[x].push_back(y);
v[y].push_back(x);
c[x][y] = z;
}
while (BFS())
{
int nod = n;
int flux = 1000000000;
while (nod != 1)
{
flux = min(flux, c[tata[nod]][nod] - F[tata[nod]][nod]);
nod = tata[nod];
}
nod = n;
while (nod != 1)
{
F[tata[nod]][nod] += flux;
F[nod][tata[nod]] -= flux;
nod = tata[nod];
}
fluxMax += flux;
}
g << fluxMax;
return 0;
}