Pagini recente » Cod sursa (job #1220535) | Cod sursa (job #2757981) | Cod sursa (job #2644255) | Cod sursa (job #2661290) | Cod sursa (job #2760387)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin{ "maxflow.in" };
ofstream fout{ "maxflow.out" };
const int oo = int(1e9);
const int MAX_N = int(1e3) + 1;
const int MAX_M = int(5e3) + 1;
int N, M;
vector<int> adj[MAX_N];
int s, t;
int capacity[MAX_N][MAX_N];
int flow[MAX_N][MAX_N];
int parent[MAX_N];
const int WHITE = 0;
const int GRAY = 1;
const int BLACK = 2;
int color[MAX_N];
void bfs_tree()
{
for (int u = 1; u <= N; ++u)
{
color[u] = WHITE;
parent[u] = 0;
}
queue<int> q;
color[s] = GRAY;
q.push(s);
while (q.empty() == false)
{
int u = q.front();
q.pop();
for (int v : adj[u])
{
if (color[v] != WHITE) continue;
if (flow[u][v] == capacity[u][v]) continue;
if (v == t) continue;
color[v] = GRAY;
parent[v] = u;
q.push(v);
}
color[u] = BLACK;
}
}
int main()
{
fin >> N >> M;
s = 1;
t = N;
for (int i = 1; i <= M; ++i)
{
int u, v;
fin >> u >> v;
fin >> capacity[u][v];
adj[u].push_back(v);
adj[v].push_back(u);
}
int max_flow{ 0 };
bool ok = true;
while (ok)
{
ok = false;
bfs_tree();
for (int leaf : adj[t])
{
if (color[leaf] == WHITE || flow[leaf][t] == capacity[leaf][t]) continue;
parent[t] = leaf;
int augumenting_flow{ oo };
for (int u = t; u != s; u = parent[u])
augumenting_flow = min(augumenting_flow, capacity[parent[u]][u] - flow[parent[u]][u]);
for (int u = t; u != s; u = parent[u])
flow[parent[u]][u] += augumenting_flow,
flow[u][parent[u]] -= augumenting_flow;
max_flow += augumenting_flow;
ok = true;
}
}
fout << max_flow << endl;
}