Pagini recente » Cod sursa (job #154843) | Cod sursa (job #2865853) | Cod sursa (job #1907540) | Cod sursa (job #1285157) | Cod sursa (job #2906467)
#include <bits/stdc++.h>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
#define NMAX 1005
int n, m;
long long flow[NMAX][NMAX];
long long cap[NMAX][NMAX];
vector<int> graph[NMAX];
vector<int> path;
long long min_val;
void bfs(int src, int dest) {
path.clear();
queue<int> q;
q.push(src);
vector<bool> vis(NMAX, false);
vis[src] = true;
min_val = LLONG_MAX;
while (!q.empty()) {
int node = q.front();
q.pop();
path.push_back(node);
if (path.size() > 1) {
int prev_node = path[path.size() - 2];
if (cap[prev_node][node] - flow[prev_node][node] < min_val &&
cap[prev_node][node] - flow[prev_node][node] != 0) {
min_val = cap[prev_node][node] - flow[prev_node][node];
}
}
if (node == dest) {
return;
}
for (int i = 0; i < graph[node].size(); ++i) {
int neigh = graph[node][i];
if (!vis[neigh] && flow[node][neigh] < cap[node][neigh]) {
vis[neigh] = true;
q.push(neigh);
}
}
}
}
int main()
{
in >> n >> m;
for (int i = 0; i < m; ++i) {
int x, y;
in >> x >> y;
graph[x].push_back(y);
in >> cap[x][y];
}
long long max_flow = 0;
while (true) {
bfs(1, n);
// cout << min_val << "\n";
// for (int i = 0; i < path.size(); ++i) {
// cout << path[i] << " ";
// }
// cout << "\n";
if (path[path.size() - 1] != n) {
break;
}
for (int i = 1; i < path.size(); ++i) {
int prev_node = path[i - 1], curr_node = path[i];
flow[prev_node][curr_node] += min_val;
flow[curr_node][prev_node] -= min_val;
}
max_flow += min_val;
}
out << max_flow;
return 0;
}