Pagini recente » Cod sursa (job #2121224) | Cod sursa (job #2865750) | Cod sursa (job #2912536) | Cod sursa (job #2611500) | Cod sursa (job #3265082)
//#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define ff first
#define ss second
#define FOR(i, a, b) for(int i = a; i <= b; ++i)
#define FORR(i, a, b) for(int i = a; i >= b; --i)
#define vi vector<int>
#define vvi vector<vi>
#define pb push_back
using namespace std;
const string TASK("maxflow");
ifstream fin(TASK + ".in");
ofstream fout(TASK + ".out");
#define cin fin
#define cout fout
const int N = 1e3 + 9, LG = 20;
int n, m;
vvi G(N);
struct edge
{
int from, to, cap, flow;
edge(int from = 0, int to = 0, int cap = 0) : from(from), to(to), cap(cap), flow(0) {}
};
vector<edge> edges;
inline void add_edge(int x, int y, int c)
{
G[x].pb(edges.size());
edges.pb({x, y, c});
G[y].pb(edges.size());
edges.pb({y, x, 0});
}
bitset<N> v;
int t[N];
inline bool Bfs()
{
v.reset();
queue<int> q;
q.push(1);
v[1] = true;
while(!q.empty())
{
int x = q.front();
q.pop();
if(x == n)return true;
for(auto id : G[x])
{
auto e = edges[id];
if(e.flow < e.cap && !v[e.to])
{
q.push(e.to);
t[e.to] = id;
v[e.to] = true;
}
}
}
return false;
}
inline int Augment()
{
int ret = INT_MAX;
for(int x = n; x != 1; x = edges[t[x]].from)
ret = min(ret, edges[t[x]].cap - edges[t[x]].flow);
for(int x = n; x != 1; x = edges[t[x]].from)
{
edges[t[x]].flow += ret;
edges[t[x] ^ 1].flow -= ret;
}
return ret;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m;
int x, y, c;
FOR(i, 1, m)
{
cin >> x >> y >> c;
add_edge(x, y, c);
}
int max_flow = 0;
for(; Bfs(); max_flow += Augment());
cout << max_flow << '\n';
return 0;
}