Pagini recente » Cod sursa (job #3272727) | Cod sursa (job #264708) | Cod sursa (job #3268734) | Cod sursa (job #3264280) | Cod sursa (job #3271538)
#include <bits/stdc++.h>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int bfs(vector<vector<int>>& edges, vector<vector<int>>& C, vector<int>& parent, int s, int t) {
parent[0] = -2;
for(int i = 1; i < parent.size(); ++i)
parent[i] = -1;
queue<pair<int, int>> q;
q.push({s, INT_MAX});
while(!q.empty()) {
int cur = q.front().first, flow = q.front().second;
q.pop();
for(auto& to: edges[cur]) {
if(parent[to] == -1 && C[cur][to]) {
parent[to] = cur;
int newFlow = min(flow, C[cur][to]);
if(to == t)
return newFlow;
q.push({to, newFlow});
}
}
}
return 0;
}
int EdmondsKarp(vector<vector<int>>& edges, vector<vector<int>>& C, int s, int t) {
int newFlow, flow = 0;
vector<int> parent(t + 1);
while(newFlow = bfs(edges, C, parent, s, t)) {
flow += newFlow;
int cur = t;
while(cur != s) {
int prev = parent[cur];
C[prev][cur] -= newFlow;
C[cur][prev] += newFlow;
cur = prev;
}
}
return flow;
}
int main() {
int n, m, x, y, cost;
f >> n >> m;
vector<vector<int>> edges(n), C(n, vector<int>(n));
for(int i = 0; i < m; ++i) {
f >> x >> y >> cost;
C[--x][--y] = cost;
edges[x].push_back(y);
edges[y].push_back(x);
}
g << EdmondsKarp(edges, C, 0, n - 1);
return 0;
}