Pagini recente » Cod sursa (job #2691724) | Cod sursa (job #2524809) | Cod sursa (job #685921) | Cod sursa (job #38649) | Cod sursa (job #2960388)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
ifstream f ("maxflow.in");
ofstream g ("maxflow.out");
vector <int> l[1001];
int n, c[1001][1001], fl[1001][1001], t[1001], v[1001];
int df (int vf)
{
int i;
stack <int> q;
q.push(vf);
v[vf] = 1;
t[vf] = 0;
while (!q.empty())
{
vf = q.top();
q.pop();
for (i = 0; i < l[vf].size(); i++)
{
if (!v[l[vf][i]] && fl[vf][l[vf][i]] < c[vf][l[vf][i]])
{
q.push(l[vf][i]);
v[l[vf][i]] = 1;
t[l[vf][i]] = vf;
if (l[vf][i] == n) return 1;
}
}
}
return 0;
}
int main()
{int m, flux = 0, i, j, x, y, capac, mn;
f >> n >> m;
for (i = 0; i < m; i++)
{
f >> x >> y >> capac;
l[x].push_back(y);
l[y].push_back(x);
c[x][y] = capac;
}
while (df(1))
{
for (int k = 0; k < l[n].size(); k++)
{
j = l[n][k];
if (!v[j] || fl[j][n] == c[j][n])
continue;
//{
t[n] = j;
i = n;
mn = 999999;
while (i > 1)
{
if (c[t[i]][i] - fl[t[i]][i] < mn)
mn = c[t[i]][i] - fl[t[i]][i];
i = t[i];
}
flux += mn;
i = n;
while (i > 1)
{
fl[t[i]][i] += mn;
fl[i][t[i]] -= mn;
i = t[i];
}
//}
}
for (i = 1; i <= n; i++)
{
v[i] = 0;
t[i] = 0;
}
}
g << flux;
return 0;
}