Pagini recente » Cod sursa (job #2130518) | Cod sursa (job #93235) | Cod sursa (job #800255) | Cod sursa (job #2466922) | Cod sursa (job #1826680)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1005;
int N, M;
vector<int> adj[NMAX];
int capacity[NMAX][NMAX];
int maximumFlow(int source, int sink) {
int residual[NMAX][NMAX]; memset(residual, 0, sizeof(residual));
int totalFlow = 0;
while (true) {
int flow[NMAX]; memset(flow, 0, sizeof(flow));
int prev[NMAX]; memset(prev, -1, sizeof(prev));
prev[source] = source; flow[source] = INT_MAX;
queue<int> q; q.push(source);
while (!q.empty()) {
int u = q.front(); q.pop();
for (int i = 0; i < adj[u].size(); i++) {
int v = adj[u][i];
if (capacity[u][v] - residual[u][v] > 0 && prev[v] == -1) {
prev[v] = u;
flow[v] = min(flow[u], capacity[u][v] - residual[u][v]);
if (v != sink) q.push(v);
else {
while (prev[v] != v) {
u = prev[v];
residual[u][v] += flow[sink];
residual[v][u] -= flow[sink];
v = u;
}
totalFlow += flow[sink];
goto end;
}
}
}
}
end:
if (prev[sink] == -1) {
return totalFlow;
}
}
return -1;
}
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d %d", &N, &M);
for (int i = 0; i < M; i++) {
int x, y, w;
scanf("%d %d %d", &x, &y, &w);
adj[x].push_back(y);
capacity[x][y] = w;
}
int ret = maximumFlow(1, N);
printf("%d\n", ret);
}