Pagini recente » Cod sursa (job #467642) | Cod sursa (job #118677) | Cod sursa (job #891801) | Cod sursa (job #1741150) | Cod sursa (job #2962305)
#include <bits/stdc++.h>
#define oo 1e9
#define N 1005
int n, t;
using namespace std;
int level[N], ptr[N];
int cap[N][N];
int flow[N][N];
int dfs (int u, int pushed) {
if (pushed == 0) return 0;
if (u == t) return pushed;
for (int &cid = ptr[u]; cid < n; cid++) {
int v = cid;
if (level[v] == level[u] + 1 && cap[u][v] - flow[u][v] > 0) {
int tr = dfs(v, min(pushed, cap[u][v] - flow[u][v]));
if (tr == 0) {
continue;
}
else{
flow[u][v] += tr;
flow[v][u] -= tr;
return tr;
}
}
}
return 0;
};
bool bfs(int s) {
memset(level, -1, sizeof(level));
queue<int> q;
q.push(s);
level[s] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v = 0; v < n; v++) {
if (level[v] == -1 && cap[u][v] - flow[u][v] > 0) {
level[v] = level[u] + 1;
q.push(v);
}
}
}
return level[t] != -1;
};
int Dinic(int s) {
queue<int> q;
int f = 0;
while (true) {
memset(level, -1, sizeof(level));
q.push(s);
level[s] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v = 0; v < n; v++) {
if (level[v] == -1 && cap[u][v] - flow[u][v] > 0) {
level[v] = level[u] + 1;
q.push(v);
}
}
}
memset(ptr, 0, sizeof(ptr));
if(level[t] == -1) break;
while (int pushed = dfs(s, oo)) {
f += pushed;
}
}
return f;
}
int main() {
freopen("maxflow.in","rt",stdin);
freopen("maxflow.out","wt",stdout);
int m;
scanf("%d %d",&n, &m);
for(int i = 0; i < m; i++){
int x, y, c;
scanf("%d %d %d",&x, &y, &c);
x--; y--;
cap[x][y] += c;
}
t = n-1;
printf("%d",Dinic(0));
return 0;
}