Pagini recente » Cod sursa (job #3284751) | Cod sursa (job #2683170) | Cod sursa (job #2638396) | Cod sursa (job #3243780) | Cod sursa (job #2028214)
#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 ST_SIZE 1048600
#define NMAX 5010
#define MMAX 5010
#define VMAX 10010
struct edge
{
int u, flow, rev;
edge(int _u = 0, int _flow = 0, int _rev = 0) : u(_u), flow(_flow), rev(_rev) {}
};
int n, m, source, sink;
int d[NMAX], ptr[NMAX];
vector<edge> adj[VMAX];
queue<int> Q;
void addEdge(int a, int b, int flow)
{
adj[a].emplace_back(b, flow, adj[b].size());
adj[b].emplace_back(a, 0, adj[a].size() - 1);
}
bool bfs()
{
memset(d, -1, sizeof d);
for(Q.push(source), d[source] = 0; !Q.empty(); Q.pop())
{
int v = Q.front();
for(auto e : adj[v])
if(d[e.u] == -1 && e.flow > 0)
{
d[e.u] = 1 + d[v];
Q.push(e.u);
}
}
return d[sink] != -1;
}
int dfs(int v, int maxFlow)
{
if(v == sink) return maxFlow;
if(maxFlow == 0) return 0;
for(; ptr[v] < adj[v].size(); ++ptr[v])
{
edge &e = adj[v][ptr[v]];
if(d[e.u] != 1 + d[v]) continue;
int augFlow = dfs(e.u, min(maxFlow, e.flow));
if(augFlow)
{
e.flow -= augFlow;
adj[e.u][e.rev].flow += augFlow;
return augFlow;
}
}
return 0;
}
int getFlow()
{
int flow, augFlow;
for(flow = 0; bfs(); )
{
memset(ptr, 0, sizeof ptr);
while(augFlow = dfs(source, INF)) flow += augFlow;
}
return flow;
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int i, x, y, z;
cin >> n >> m;
source = 1;
sink = n;
for(i = 1; i <= m; ++i)
{
cin >> x >> y >> z;
addEdge(x, y, z);
}
cout << getFlow() << '\n';
return 0;
}