Pagini recente » Cod sursa (job #1937552) | Cod sursa (job #573018) | Cod sursa (job #822958) | Cod sursa (job #1908856) | Cod sursa (job #3041729)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define MAX_N 1000
#define MAX_M 5000
std::ifstream in("maxflow.in");
std::ofstream out("maxflow.out");
int n, m;
int c[MAX_N + 1][MAX_N + 1], f[MAX_N + 1][MAX_N + 1], t[MAX_N + 1], flow;
bool vis[MAX_N + 1], inv[MAX_N + 1][MAX_N + 1];
std::vector<int> adj[MAX_N + 1];
std::queue<int> q;
void read()
{
in>>n>>m;
int x, y, z;
for(int i = 0;i < m;i++)
{
in>>x>>y>>z;
adj[x].push_back(y);
adj[y].push_back(x);
inv[y][x] = 1;
c[x][y] = z;
}
}
bool bfs()
{
memset(vis, 0, sizeof(vis));
memset(t, 0, sizeof(t));
q.push(1);
vis[1] = true;
while(!q.empty())
{
int curr = q.front();
q.pop();
if(curr == n) continue;
for(const auto& it : adj[curr])
{
if(!vis[it] && ((inv[curr][it] && f[curr][it]) ||
(!inv[curr][it] && c[curr][it] > f[curr][it])))
{
q.push(it);
vis[it] = true;
t[it] = curr;
}
}
}
return vis[n];
}
void solve()
{
int fmin;
while(bfs())
{
for (const auto &it: adj[n])
{
int nod = it;
if (vis[nod] && (!inv[nod][n] && c[nod][n] > f[nod][n]))
{
t[n] = nod;
for (int i = n; i != 1; i = t[i])
{
if (inv[t[i]][i])
fmin = std::min(fmin, f[t[i]][i]);
else
fmin = std::min(fmin, c[t[i]][i] - f[t[i]][i]);
}
for (int i = n; i != 1; i = t[i])
{
if (inv[t[i]][i])
f[t[i]][i] -= fmin;
else
f[t[i]][i] += fmin;
}
flow += fmin;
}
}
}
out<<flow<<'\n';
}
int main()
{
read();
solve();
return 0;
}