Pagini recente » Cod sursa (job #2321099) | Cod sursa (job #1974325) | Cod sursa (job #2988185) | Cod sursa (job #2673534) | Cod sursa (job #3262519)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n, m;
vector<vector<int>> C, G;
vector<int> parent;
bool bfs(int start, int end) {
vector<bool> visited(n + 1, false);
queue<int> Q;
Q.push(start);
visited[start] = true;
while (!Q.empty()) {
int node = Q.front();
Q.pop();
for (int neighbor : G[node]) {
if (!visited[neighbor] && C[node][neighbor] > 0) {
parent[neighbor] = node;
visited[neighbor] = true;
if (neighbor == end)
return true;
Q.push(neighbor);
}
}
}
return false;
}
int eKarp(int start, int end) {
int maxFlow = 0;
while(bfs(start, end)) {
int pathFlow = 2e9;
for (int v = end; v != start; v = parent[v]) {
int u = parent[v];
pathFlow = min(pathFlow, C[u][v]);
}
for (int v = end; v != start; v = parent[v]) {
int u = parent[v];
C[u][v] -= pathFlow;
C[v][u] += pathFlow;
}
maxFlow += pathFlow;
}
return maxFlow;
}
int main() {
fin >> n >> m;
parent.resize(n + 1);
G.resize(n + 1);
C.resize(n + 1, vector<int>(n + 1, 0));
for(; m; --m) {
int x, y, z;
fin >> x >> y >> z;
G[x].push_back(y);
G[y].push_back(x);
C[x][y] += z;
}
fout << eKarp(1, n) << "\n";
return 0;
}