Pagini recente » Cod sursa (job #461040) | Cod sursa (job #1936845) | Cod sursa (job #571432) | Cod sursa (job #2053792) | Cod sursa (job #2485616)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("maxflow.in");
ofstream g ("maxflow.out");
constexpr int INF = 0x3f3f3f3f;
constexpr int NMAX = 1e3 + 5;
vector <int> G[NMAX];
int cap[NMAX][NMAX];
int flow[NMAX][NMAX];
int n, m;
int tata[NMAX];
bool exista_drum (int start)
{
queue <int> Q;
for (int i=1; i<=n; ++i) tata[i] = -1;
Q.push(start);
tata[start] = 0;
while (!Q.empty())
{
int nod = Q.front();
Q.pop();
for (auto it : G[nod])
{
if (tata[it] == -1 && cap[nod][it] != flow[nod][it])
{
tata[it] = nod;
if (it == n) return 1;
Q.push(it);
}
}
}
return 0;
}
int main()
{
f >> n >> m;
for (int i=1; i<=m; ++i)
{
int x, y, z;
f >> x >> y >> z;
cap[x][y] = z;
flow[x][y] = flow[y][x] = 0;
G[x].push_back(y);
G[y].push_back(x);
}
int ans = 0;
while (exista_drum(1))
{
int nod = n;
int sol = INF;
while (tata[nod] > 0)
{
sol = min(sol, cap[tata[nod]][nod] - flow[tata[nod]][nod]);
nod = tata[nod];
}
nod = n;
ans = ans + sol;
while (tata[nod] > 0)
{
flow[tata[nod]][nod] += sol;
flow[nod][tata[nod]] -= sol;
nod = tata[nod];
}
}
g << ans << '\n';
return 0;
}