Pagini recente » Cod sursa (job #3132282) | Cod sursa (job #1336549) | Cod sursa (job #2874526) | Cod sursa (job #2652575) | Cod sursa (job #2754722)
#include <bits/stdc++.h>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const long long inf = (long long)1e18 + 5;
const long long max_n = (long long)1e3 + 5;
long long n, m;
long long r[max_n][max_n];
vector<long long> g[max_n];
bool visited[max_n];
long long lvl[max_n];
bool bfs()
{
for (long long i = 1; i <= n; ++i)
{
visited[i] = false;
}
queue<long long> q;
visited[1] = true;
q.push(1);
lvl[1] = 1;
while ((long long)q.size() > 0)
{
long long u = q.front();
q.pop();
for (long long v : g[u])
{
if (!visited[v])
{
if (r[u][v] > 0)
{
q.push(v);
visited[v] = true;
lvl[v] = 1 + lvl[u];
}
}
}
}
return visited[n];
}
long long dfs(long long u, long long flow)
{
if (u == n)
{
return flow;
}
for (long long v : g[u])
{
if (!visited[v])
{
if (r[u][v] > 0 && lvl[v] == 1 + lvl[u])
{
long long res = dfs(v, min(flow, r[u][v]));
if (res > 0)
{
r[u][v] -= res;
r[v][u] += res;
return res;
}
else
{
visited[v] = true;
}
}
}
}
return 0;
}
int main()
{
in >> n >> m;
for (long long i = 1; i <= m; ++i)
{
long long u, v, c;
in >> u >> v >> c;
r[u][v] += c;
g[u].push_back(v);
g[v].push_back(u);
}
long long flow = 0;
while (bfs() == true)
{
long long pmp;
fill(visited + 1, visited + n + 1, false);
while (pmp = dfs(1, inf))
{
fill(visited + 1, visited + n + 1, false);
flow += pmp;
}
}
out << flow << "\n";
return 0;
}