Pagini recente » Cod sursa (job #1871426) | Cod sursa (job #2113026) | Cod sursa (job #1064093) | Cod sursa (job #2627855) | Cod sursa (job #2423797)
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
const int INF = 0x3f3f3f3f;
struct edge {
int to, flow;
};
int i, n, m, x, y, z, q[N], dist[N], ptr[N], st, dr;
vector<edge> E;
vector<int> lda[N];
void addEdge(int x, int y, int flow) {
E.push_back({y, flow});
E.push_back({x, 0});
lda[x].push_back(E.size() - 2);
lda[y].push_back(E.size() - 1);
}
bool bfs() {
memset(dist, INF, sizeof(dist));
dist[1] = 0;
for (st = dr = 0, q[st] = 1; st <= dr && dist[n] == INF; ++st) {
int x = q[st];
for (int it : lda[x]) {
if (dist[E[it].to] != INF || E[it].flow <= 0) continue;
dist[E[it].to] = dist[x] + 1;
q[++dr] = E[it].to;
}
}
return dist[n] != INF;
}
int dfs(int x, int flow) {
if (x == n || flow <= 0) return flow;
for (; ptr[x] < lda[x].size(); ++ptr[x]) {
int it = lda[x][ptr[x]];
if (dist[E[it].to] != dist[x] + 1) continue;
int pushed = dfs(E[it].to, min(flow, E[it].flow));
if (pushed > 0) {
E[it].flow -= pushed;
E[it ^ 1].flow += pushed;
return pushed;
}
}
return 0;
}
int maxFlow() {
int flow = 0;
while (bfs()) {
//cerr << "123\n";
memset(ptr, 0, sizeof(ptr));
while(1) {
int pushed = dfs(1, INF);
if (!pushed) break;
flow += pushed, exit(0);
}
}
return flow;
}
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
for(scanf("%d %d", &n, &m); m; --m) {
scanf("%d %d %d", &x, &y, &z);
addEdge(x, y, z);
}
printf("%d\n", maxFlow());
return 0;
}