Pagini recente » Cod sursa (job #1189007) | Cod sursa (job #1805305) | Cod sursa (job #259760) | Cod sursa (job #533302) | Cod sursa (job #2693608)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 1001
#define INF 110002
using namespace std;
int n, m;
int residual[NMAX][NMAX];
vector<vector<int>> v;
vector<int> par;
bool bfs(){
queue<int> q;
for(int i=1;i<=n;++i)
par[i] = 0;
q.push(1);
par[1] = -1;
while(!q.empty() && !par[n]){
int curr = q.front();
q.pop();
for(auto &node: v[curr])
if(residual[curr][node] && !par[node]){
par[node] = curr;
q.push(node);
}
}
return par[n] != 0;
}
int edmonds_karp(){
int max_flow = 0;
while(bfs())
for(auto &node: v[n]){
int curr = n;
par[curr] = node;
if(par[node]>0){
int flow = INF;
while(par[curr] != -1){
flow = min(flow, residual[par[curr]][curr]);
curr = par[curr];
}
curr = n;
while(par[curr] != -1){
residual[par[curr]][curr] -= flow;
residual[curr][par[curr]] += flow;
curr = par[curr];
}
max_flow += flow;
}
}
return max_flow;
}
int main() {
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
fin>>n>>m;
int x, y, c;
v.resize(n+1);
par.resize(n+1, 0);
for(int i=0;i<m;++i){
fin>>x>>y>>c;
residual[x][y] = c;
v[x].emplace_back(y);
v[y].emplace_back(x);
}
fout<<edmonds_karp();
return 0;
}