Pagini recente » Cod sursa (job #1205134) | Cod sursa (job #1080882) | Cod sursa (job #1989520) | Cod sursa (job #2505972) | Cod sursa (job #1871758)
#include <cstring>
#include <vector>
#include <fstream>
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
#define NMAX 5001
#define INF 0x3f3f3f3f
int n, m;
int cd[NMAX], viz[NMAX], c[NMAX][NMAX], f[NMAX][NMAX], t[NMAX];
vector<int> g[NMAX];
int rez()
{
int nod, v;
cd[0] = 1;
cd[1] = 1;
memset(viz, 0, sizeof(viz));
viz[1] = 1;
for (int i = 1; i <= cd[0]; i++)
{
nod = cd[i];
if (nod == n) continue;
for (unsigned int j = 0; j < g[nod].size(); j++)
{
v = g[nod][j];
if (c[nod][v] == f[nod][v] || viz[v]) continue;
viz[v] = 1;
cd[++cd[0]] = v;
t[v] = nod;
}
}
return viz[n];
}
int main()
{
int flow, fmin, x, y, z, nod;
fin >> n >> m;
for (int i = 1; i <= m; i++)
{
fin >> x >> y >> z;
c[x][y] += z;
g[x].push_back(y);
g[y].push_back(x);
}
for (flow = 0; rez();)
for (unsigned int i = 0; i < g[n].size(); i++)
{
nod = g[n][i];
if (f[nod][n] == c[nod][n] || !viz[nod]) continue;
t[n] = nod;
fmin = INF;
for (nod = n; nod != 1; nod = t[nod])
fmin = min(fmin, c[t[nod]][nod] - f[t[nod]][nod]);
if (fmin == 0) continue;
for (nod = n; nod != 1; nod = t[nod])
{
f[t[nod]][nod] += fmin;
f[nod][t[nod]] -= fmin;
}
flow += fmin;
}
fout << flow;
return 0;
}