Pagini recente » Cod sursa (job #2713263) | Cod sursa (job #3030428) | Cod sursa (job #906960) | Cod sursa (job #1307667) | Cod sursa (job #2247551)
#include <bits/stdc++.h>
using namespace std;
#define NMAX 1009
#define inf (1 << 30)
vector<int> G[NMAX];
int cap[NMAX][NMAX], flow[NMAX][NMAX];
int n, m, p[NMAX];
int source, destination;
void read_input() {
cin >> n >> m;
//cin >> source >> destination;
source = 1, destination = n;
for (int i = 1; i <= m; ++i) {
int x, y,c;
cin >> x >> y >> c;
cap[x][y] += c;
G[x].push_back(y);
G[y].push_back(x);
}
}
int bfs(int source, int destination) {
memset(p, 0, sizeof(p));
queue<int> q;
q.push(source);
while (!q.empty()) {
auto node = q.front();
q.pop();
if (node == destination) {
continue;
}
for (auto &it : G[node] ) {
if (!p[it] && flow[node][it] < cap[node][it]) {
p[it] = node;
q.push(it);
}
}
}
return p[destination] != 0;
}
void solve() {
int maxflow = 0;
while (bfs(source, destination)) {
for (auto &it : G[destination]) {
if (p[it] != 0 && flow[it][destination] < cap[it][destination]) {
p[destination] = it;
int minflow = inf;
for (auto node = destination; node != source; node = p[node]) {
minflow = min(minflow, cap[p[node]][node] - flow[p[node]][node]);
}
if (minflow > 0) {
maxflow += minflow;
for (auto node = destination; node != source; node = p[node]) {
flow[p[node]][node] += minflow;
flow[node][p[node]] -= minflow;
}
}
}
}
}
cout << maxflow << "\n";
}
void clear_test() {
for (int i = 1 ;i<=n; ++i) {
G[i].clear();
}
n = 0;
memset(cap, 0, sizeof(cap));
memset(flow, 0, sizeof(flow));
memset(p, 0, sizeof(p));
}
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int t;
//cin >> t;
t = 1;
while (t--) {
read_input();
solve();
clear_test();
}
return 0;
}