Pagini recente » Cod sursa (job #2085374) | Cod sursa (job #2108968) | Cod sursa (job #381898) | Diferente pentru teorema-chineza-a-resturilor intre reviziile 89 si 42 | Cod sursa (job #1496987)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
int main(){
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n, m;
f >> n >> m;
vector<vector<int> > cap(n, vector<int>(n, 0)),
flow(n, vector<int>(n, 0)),
graf(n);
for(int i = 0, a, b, c; i < m; ++i){
f >> a >> b >> c;
--a, --b;
cap[a][b] = c;
graf[a].push_back(b);
graf[b].push_back(a); }
vector<int> tata(n, 0);
vector<bool> e_viz(n, false);
queue<int> de_viz;
int rez = 0;
while(true){
e_viz[0] = true;
de_viz.push(0);
while(!de_viz.empty()){
const int cur = de_viz.front();
de_viz.pop();
if(cur != n-1){
for(const auto next : graf[cur]){
if(!e_viz[next] && cap[cur][next] - flow[cur][next] > 0){
e_viz[next] = true;
de_viz.push(next);
tata[next] = cur; } } } }
if(!e_viz[n-1]){
break; }
for(auto start : graf[n-1]){
int min_flow = cap[start][n-1] - flow[start][n-1];
for(int i = start, j = tata[start]; i != 0; i = j, j = tata[j]){
min_flow = min(min_flow, cap[j][i] - flow[j][i]); }
if(min_flow > 0){
for(int i = start, j = tata[start]; i != 0; i = j, j = tata[j]){
flow[j][i] += min_flow;
flow[i][j] -= min_flow; } }
rez += min_flow; }
fill(begin(tata), end(tata), 0);
fill(begin(e_viz), end(e_viz), false); }
g << rez;
return 0; }