Pagini recente » Cod sursa (job #64853) | Cod sursa (job #2097931) | Cod sursa (job #2309192) | Cod sursa (job #2966937) | Cod sursa (job #2197360)
#include <bits/stdc++.h>
using namespace std;
using uint = unsigned int;
using ll = long long;
using pii = pair<int, int>;
#define dbg(x) cerr<<#x": "<<(x)<<'\n'
#define dbg_v(x, n) {cerr<<#x"[]: ";for(long long _=0;_<n;++_)cerr<<(x)[_]<<' ';cerr<<'\n';}
#define all(v) v.begin(), v.end()
#define INF 2000000010
#define MOD 1000000007
#define ST_SIZE 1048600
#define QMAX
#define VMAX 1010
int Source = 0;
int Sink = VMAX - 1;
struct Edge {
int to, flow;
};
int lv[VMAX], ptr[VMAX];
vector<int> adj[VMAX];
vector<Edge> edges;
void addEdge(int a, int b, int flow) {
edges.push_back({b, flow});
edges.push_back({a, 0});
adj[a].push_back(edges.size() - 2);
adj[b].push_back(edges.size() - 1);
}
bool bfs(int v) {
queue<int> q;
memset(lv, 0, sizeof lv);
for(lv[v] = 1, q.push(v); !q.empty(); q.pop()) {
v = q.front();
for(auto e : adj[v])
if(edges[e].flow && !lv[edges[e].to]) {
lv[edges[e].to] = 1 + lv[v];
q.push(edges[e].to);
}
}
return lv[Sink] != 0;
}
int dfs(int v, int flow) {
if(v == Sink) return flow;
int pushed;
for(; ptr[v] < (int) adj[v].size(); ++ptr[v]) {
auto e = adj[v][ptr[v]];
if(edges[e].flow && lv[edges[e].to] == 1 + lv[v]) {
pushed = dfs(edges[e].to, min(edges[e].flow, flow));
if(pushed) {
edges[e].flow -= pushed;
edges[e ^ 1].flow += pushed;
return pushed;
}
}
}
return 0;
}
int dinic() {
int flow = 0, pushed;
while(bfs(Source)) {
memset(ptr, 0, sizeof ptr);
while(pushed = dfs(Source, INF))
flow += pushed;
}
return flow;
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
ios_base::sync_with_stdio(false);
int i, j, n, m, a, b, c;
cin >> n >> m;
for(i = 1; i <= m; ++i) {
cin >> a >> b >> c;
addEdge(a, b, c);
}
Source = 1;
Sink = n;
cout << dinic() << '\n';
return 0;
}