Pagini recente » Cod sursa (job #1697512) | Cod sursa (job #1962198) | Cod sursa (job #3216339) | Cod sursa (job #2600076) | Cod sursa (job #2888528)
#include <fstream>
#include <vector>
#include <queue>
#define nmax 1000
using namespace std;
ifstream cin ("maxflow.in");
ofstream cout ("maxflow.out");
vector<int> ad[nmax + 1];
queue<int> q;
const int inf = 1e9;
int n, flux[nmax + 1][nmax + 1], prv[nmax + 1], f[nmax + 1], cap[nmax + 1][nmax + 1];
bool bfs()
{
int a;
for (int i = 1; i <= n; i++)
f[i] = 0;
f[1] = 1, q.push (1);
while (!q.empty())
{
a = q.front(), q.pop();
if (a != n)
for (auto b : ad[a])
if (f[b] == 0 && cap[a][b] - flux[a][b] > 0)
{
f[b] = 1;
prv[b] = a;
q.push (b);
}
}
return f[n];
}
int main()
{
int m, i, j, a, b, c, minn, ftot = 0;
cin >> n >> m;
for (i = 1; i <= m; i++)
{
cin >> a >> b >> c;
ad[a].push_back (b), ad[b].push_back (a);
cap[a][b] = c;
}
while (bfs())
{
for (auto a : ad[n])
{
if (f[a] && flux[a][n] < cap[a][n])
{
minn = inf, prv[n] = a;
for (i = n; i != 1; i = prv[i])
minn = min (minn, cap[prv[i]][i] - flux[prv[i]][i]);
if (minn)
{
for (i = n; i != 1; i = prv[i])
{
flux[prv[i]][i] += minn;
flux[i][prv[i]] -= minn;
}
ftot += minn;
}
}
}
}
cout << ftot;
return 0;
}