Pagini recente » Cod sursa (job #693590) | Cod sursa (job #2857503) | Cod sursa (job #2379192) | Cod sursa (job #1839234) | Cod sursa (job #2955889)
#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;
c[x][y] += z;
v[x].push_back(y);
v[y].push_back(x);
}
for (fluxMax = 0; BFS();)
{
for (int i = 0; i < v[n].size(); i++)
{
int vecin = v[n][i];
if (c[vecin][n] == F[vecin][n] || !viz[vecin])
continue;
tata[n] = vecin;
int flux = 1 << 30;
for (int nod = n; nod != 1; nod = tata[nod])
flux = min(flux, c[tata[nod]][nod] - F[tata[nod]][nod]);
if (flux == 0)
continue;
for (int nod = n; nod != 1; nod = tata[nod])
{
F[tata[nod]][nod] += flux;
F[nod][tata[nod]] -= flux;
}
fluxMax += flux;
}
}
g << fluxMax;
return 0;
}