Pagini recente » Cod sursa (job #2575504) | Cod sursa (job #2321153) | Cod sursa (job #3172637) | Cod sursa (job #1985831) | Cod sursa (job #2960282)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
int n,m;
vector<vector <int>> adjacency;
vector<bool> visited;
vector<int> parent;
queue<int> q;
vector<vector<int>> residual;
int source, sink;
int bfs (int node) {
fill(visited.begin(), visited.end(), 0);
visited[node] = 1;
q.push(node);
while (!q.empty()) {
int currentNode = q.front();
q.pop();
for (auto i:adjacency[currentNode]) {
if (!visited[i] && i!=n && residual[currentNode][i]>0) {
visited[i] = 1;
q.push(i);
parent[i] = currentNode;
}
}
}
int max_flow_possible = 0;
for (auto i : adjacency[n]) {
if (!visited[i]) continue;
int flow_min = residual[i][n];
int aux_i = i;
while (aux_i != 1) {
flow_min = min(flow_min, residual[parent[aux_i]][aux_i]);
aux_i = parent[aux_i];
}
residual[n][i] += flow_min;
residual[i][n] -= flow_min;
aux_i = i;
while (aux_i != 1) {
residual[aux_i][parent[aux_i]] += flow_min;
residual[parent[aux_i]][aux_i] -= flow_min;
aux_i = parent[aux_i];
}
max_flow_possible += flow_min;
}
return max_flow_possible;
}
int max_flow_getter() {
int total_max_flow = 0;
int augment_path = bfs(source);
while (augment_path) {
total_max_flow += augment_path;
augment_path = bfs(source);
}
return total_max_flow;
}
int main () {
fin >> n >> m;
adjacency.resize(n+1);
visited.resize(n+1,0);
residual.resize(n+1, vector<int>(n+1, 0));
parent.resize(n+1, -1);
source = 1;
sink = n;
for (int i=0; i<m; i++) {
int x,y,z;
fin >> x >> y >> z;
adjacency[x].push_back(y);
adjacency[y].push_back(x);
residual[x][y] += z;
}
fout << max_flow_getter();
return 0;
}