Pagini recente » Cod sursa (job #1029868) | Cod sursa (job #256466) | Cod sursa (job #123559) | Cod sursa (job #2401008) | Cod sursa (job #2928482)
#include <fstream>
#include <climits>
#include <queue>
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
const int nmax = 1000, mmax = 5000;
int n, m, path[nmax + 1], capacity[nmax + 1][nmax + 1], flow[nmax + 1][nmax + 1];
bool Bfs(int source, int sink, int& maxflow) {
maxflow = INT_MAX;
queue<int> q;
q.push(source);
while (!q.empty()) {
int v = q.front();
q.pop();
for (int u = 1; u <= n; u++) {
if (capacity[v][u] > flow[v][u] && capacity[v][u] && path[u] == 0) {
maxflow = min(maxflow, capacity[v][u] - flow[v][u]);
path[u] = v;
if (u == sink)
return true;
q.push(u);
}
}
}
return false;
}
int EdmondsKarp(int source, int sink) {
int ans_flow = 0, maxflow;
while (Bfs(source, sink, maxflow)) {
int u = sink;
ans_flow += maxflow;
while (u != source) {
int v = path[u];
flow[v][u] = flow[v][u] + maxflow;
flow[u][v] = flow[u][v] - maxflow;
u = v;
}
for (int i = 1; i <= n; i++)
path[i] = 0;
}
return ans_flow;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int x, y, z;
cin >> x >> y >> z;
capacity[x][y] = z;
}
cout << EdmondsKarp(1, n);
}