Pagini recente » Cod sursa (job #2946927) | Cod sursa (job #2260606) | Monitorul de evaluare | Cod sursa (job #1239123) | Cod sursa (job #2499334)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int N = 1000 + 7;
int n;
int m;
int cap[N][N];
vector<int> g[N];
int level[N];
int dumb(int a, int mn)
{
if (a == n)
{
return mn;
}
for (auto &b : g[a])
{
if (level[b] == 1 + level[a] && cap[a][b] > 0)
{
int x = dumb(b, min(mn, cap[a][b]));
if (x > 0)
{
cap[a][b] -= x;
cap[b][a] += x;
return x;
}
}
}
return 0;
}
int main()
{
freopen ("maxflow.in", "r", stdin);
freopen ("maxflow.out", "w", stdout);
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
int a, b, c;
cin >> a >> b >> c;
g[a].push_back(b);
g[b].push_back(a);
cap[a][b] += c;
}
int ans = 0;
while (1)
{
for (int i = 1; i <= n; i++)
{
level[i] = -1;
}
level[1] = 0;
queue<int> q;
q.push(1);
while (!q.empty())
{
int a = q.front();
q.pop();
for (auto &b : g[a])
{
if (cap[a][b] > 0 && level[b] == -1)
{
level[b] = 1 + level[a];
q.push(b);
}
}
}
if (level[n] == -1)
{
break;
}
int x = dumb(1, (int) 1e9);
while (x)
{
ans += x;
x = dumb(1, (int) 1e9);
}
}
cout << ans << "\n";
}