Pagini recente » Cod sursa (job #645025) | Cod sursa (job #1287503) | Cod sursa (job #1106746) | Cod sursa (job #641135) | Cod sursa (job #3320294)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e3 + 5;
const int INF = 1e9;
struct Edge {
int to,r;
int cap;
};
vector<Edge> e[NMAX];
int level[NMAX],it[NMAX];
int n,s,d,m;
void addEdge(int u, int v, int cap) {
Edge a = {v, (int) e[v].size(), cap};
Edge b = {u, (int) e[u].size(), 0};
e[u].push_back(a);
e[v].push_back(b);
}
bool bfs() {
fill(level, level + n +1, -1);
queue<int> q;
level[s] = 0;
q.push(s);
while (!q.empty()) {
int u = q.front();
q.pop();
for (auto &a: e[u]) {
if (level[a.to] == -1 && a.cap > 0) {
level[a.to] = level[u] + 1;
q.push(a.to);
}
}
}
return level[d] != -1;
}
int dfs(int u, int flow) {
if (u == d)
return flow;
for (int &i = it[u];i < (int)e[u].size();i++) {
Edge &a = e[u][i];
if (a.cap > 0 && level[a.to] == level[u] + 1) {
int b = dfs(a.to, min(flow, a.cap));
if (b > 0) {
a.cap -= b;
e[a.to][a.r].cap += b;
return b;
}
}
}
return 0;
}
int dinic() {
int mx = 0,b;
while (bfs()) {
fill(it, it + n + 1, 0);
b = dfs(s, INF);
while (b) {
mx += b;
b = dfs(s, INF);
}
}
return mx;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int u,v,c;
fin >> n >> m;
s = 1;
d = n;
for (int i = 0;i < m;i++) {
fin >> u >> v >> c;
addEdge(u, v, c);
}
fout << dinic() << '\n';
return 0;
}