Pagini recente » Cod sursa (job #2371372) | Cod sursa (job #2107967) | Cod sursa (job #2065779) | Cod sursa (job #2101871) | Cod sursa (job #1423688)
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
const int MX = 1001, INF = 1e9;
int n, m, x, y, c;
vector<vector<int> > adj(MX);
int cap[MX][MX], ans = 0, from[MX];
bool find() {
memset(from, -1, sizeof from);
queue<int> q;
q.push(1);
int v[MX];
for (int i = 0; i < MX; i++) {
v[i] = 0;
}
v[1] = 1;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = 0; i < adj[u].size(); i++) {
int d = adj[u][i];
if (!v[d] && cap[u][d] > 0) {
q.push(d);
v[d] = 1;
from[d] = u;
}
}
}
int d = n, mn = INF;
while (from[d] != -1) {
mn = min(cap[from[d]][d], mn);
d = from[d];
}
d = n;
while (from[d] != -1) {
cap[from[d]][d] -= mn;
cap[d][from[d]] += mn;
d = from[d];
}
if (mn == INF) return 0;
else {
ans += mn;
return 1;
}
}
int main() {
freopen ("maxflow.in", "r", stdin);
freopen ("maxflow.out", "w", stdout);
scanf("%d%d", &n, &m);
memset(cap, 0, sizeof cap);
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &x, &y, &c);
adj[x].push_back(y);
cap[x][y] = c;
}
while (find());
printf("%d", ans);
return 0;
}