Pagini recente » Cod sursa (job #975335) | Cod sursa (job #2509022) | Cod sursa (job #378716) | Cod sursa (job #3232299) | Cod sursa (job #2453461)
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
const int N = 1000 + 7;
struct dumbFlow {
int n;
int cap[N][N];
int par[N];
vector <int> g[N];
bool vis[N];
void AddEdge(int a, int b, int c) {
cap[a][b] += c;
g[a].push_back(b);
g[b].push_back(a);
}
bool BFS() {
for (int i = 1; i <= n; i++) {
vis[i] = 0;
}
queue <int> Q;
Q.push(1);
while (!Q.empty()) {
int nod = Q.front();
Q.pop();
if (nod == n) {
continue;
}
for (auto &nou : g[nod]) {
if (!vis[nou] && cap[nod][nou]) {
vis[nou] = 1;
par[nou] = nod;
Q.push(nou);
}
}
}
return vis[n];
}
int maxFlow() {
int flow = 0;
while (BFS()) {
for (auto &nod : g[n]) {
if (vis[nod]) {
int curNode = nod, curMin = (1 << 30);
while (curMin > 0 && curNode != 1) {
curMin = min(curMin, cap[par[curNode]][curNode]);
curNode = par[curNode];
}
if (curMin > 0) {
flow += curMin;
int curNode = nod;
while (curNode != 1) {
cap[par[curNode]][curNode] -= curMin;
cap[curNode][par[curNode]] += curMin;
curNode = par[curNode];
}
}
}
}
}
return flow;
}
};
dumbFlow myFlow;
int main() {
freopen ("maxflow.in", "r", stdin);
freopen ("maxflow.out", "w", stdout);
int m;
cin >> myFlow.n >> m;
for (int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
myFlow.AddEdge(a, b, c);
}
printf("%d\n", myFlow.maxFlow());
return 0;
}