Pagini recente » Cod sursa (job #3359001) | Cod sursa (job #2936646) | Atasamentele paginii Profil gasengineer080 | Cod sursa (job #1073179) | Cod sursa (job #3311843)
#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
struct Dinic {
int n;
vector<int> last, clast, dist;
struct Edge {
int from, to, cap, prev;
};
vector<Edge> edges;
Dinic(int N) {
n = N + 1;
last.resize(n, -1);
}
void addEdge(int from, int to, int cap) {
edges.push_back({from, to, cap, last[from]});
last[from] = edges.size() - 1;
edges.push_back({to, from, 0, last[to]});
last[to] = edges.size() - 1;
}
bool bfs(int s, int d) {
last = clast;
dist.assign(n, inf);
dist[s] = 0;
queue<int> q;
q.push(s);
while (!q.empty()) {
int x = q.front();
q.pop();
for (int i = last[x]; i != -1; i = edges[i].prev) {
if (edges[i].cap == 0)
continue;
if (dist[edges[i].to] == inf) {
dist[edges[i].to] = 1 + dist[x];
q.push(edges[i].to);
}
}
}
return dist[d] < inf;
}
int dfs(int nod, int d, int push) {
if (push == 0 || nod == d)
return push;
int real = 0;
for (int i = last[nod]; i != -1; i = edges[i].prev) {
last[nod] = i;
if (edges[i].cap > 0 && dist[nod] + 1 == dist[edges[i].to]) {
int x = dfs(edges[i].to, d, min(push, edges[i].cap));
edges[i].cap -= x;
edges[i ^ 1].cap += x;
push -= x;
real += x;
}
if (push == 0)
break;
}
return real;
}
int maxFlow(int s, int d) {
clast = last;
int ans = 0;
while (bfs(s, d)) {
ans += dfs(s, d, inf);
}
return ans;
}
};
signed main() {
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
int n, m;
cin >> n >> m;
Dinic g(m);
for (int i = 0; i < m; i ++) {
int x, y, z;
cin >> x >> y >> z;
g.addEdge(x, y, z);
}
cout << g.maxFlow(1, n) << '\n';
}