Pagini recente » Cod sursa (job #1455821) | Cod sursa (job #2857402) | Cod sursa (job #1148281) | Cod sursa (job #1022153) | Cod sursa (job #1496998)
#include <fstream>
#include <iostream>
#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, -1);
vector<bool> e_viz(n, false);
queue<int> de_viz;
int rez = 0;
while(true){
e_viz[0] = true;
tata[0] = 0;
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]){
if(e_viz[start]){
tata[n-1] = start;
int min_flow = 200000;
for(int i = n-1; i != 0; i = tata[i]){
min_flow = min(min_flow, cap[tata[i]][i] - flow[tata[i]][i]); }
if(min_flow > 0){
for(int i = n-1; i != 0; i = tata[i]){
flow[tata[i]][i] += min_flow;
flow[i][tata[i]] -= min_flow; }
rez += min_flow; } } }
fill(begin(tata), end(tata), -1);
fill(begin(e_viz), end(e_viz), false); }
g << rez;
return 0; }