Pagini recente » Borderou de evaluare (job #1325250) | Borderou de evaluare (job #1774905) | Borderou de evaluare (job #1755368) | Borderou de evaluare (job #1672471) | Cod sursa (job #1967798)
#include <bits/stdc++.h>
using namespace std;
constexpr int maxn = 1e3 + 100;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
vector<int> vec[maxn] = {};
int n, m, s, t, cap[maxn][maxn] = {}, flux[maxn][maxn] = {},
tata[maxn] = {};
bool build_tree(){
queue<int> de_viz;
de_viz.push(s);
memset(tata, 0, sizeof(tata));
while(!de_viz.empty()){
const int cur = de_viz.front();
de_viz.pop();
for(const auto next : vec[cur]){
if(tata[next] || flux[cur][next] == cap[cur][next]) continue;
tata[next] = cur;
if(next != t) de_viz.push(next); } }
return tata[t]; }
int do_flux(){
int max_flux = 0;
while(build_tree()){
for(const auto x : vec[t]){
if(tata[x] == 0 || cap[x][t] == flux[x][t]) continue;
int delta = 1e9;
tata[t] = x;
for(int nod = t; nod != s; nod = tata[nod])
delta = min(delta, cap[tata[nod]][nod] - flux[tata[nod]][nod]);
max_flux += delta;
for(int nod = t; nod != s; nod = tata[nod])
flux[tata[nod]][nod] += delta,
flux[nod][tata[nod]] -= delta; } }
return max_flux; }
int main(){
f >> n >> m;
s = 1, t = n;
for(int i = 0, x, y, z; i < m; ++i){
f >> x >> y >> z;
cap[x][y] = z;
vec[x].push_back(y);
vec[y].push_back(x); }
g << do_flux() << endl;
return 0; }