Pagini recente » Cod sursa (job #2508026) | Cod sursa (job #2982149) | Cod sursa (job #3165794) | Cod sursa (job #557222) | Cod sursa (job #2821662)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int const N = 1001 , inf = (1 << 30);
int cap[N][N] , f[N][N] , h[N] , viz[N] , q[N] , n , m , maxflow;
vector<int> v[N];
bool bfs(){
for(int i = 1 ; i <= n ; ++ i)
h[i] = 0;
int st , dr;
st = 1 , dr = 0;
q[++ dr] = 1;
h[1] = 1;
while(st <= dr){
int x = q[st ++];
for(int &y : v[x]){
if(!h[y] && cap[x][y] - f[x][y] > 0){
h[y] = 1 + h[x];
q[++ dr] = y;
}
}
}
return h[n] != 0;
}
int dfs(int node , int ans){
viz[node] = true;
if(node == n)
return ans;
for(int &y : v[node]){
if(!viz[y] && h[node] + 1 == h[y] && cap[node][y] - f[node][y] > 0){
int flow = dfs(y , min(ans , cap[node][y] - f[node][y]));
if(flow > 0){
f[node][y] += flow;
f[y][node] -= flow;
return flow;
}
}
}
return 0;
}
int dfs(){
for(int i = 1 ; i <= n ; ++ i)
viz[i] = 0;
return dfs(1 , inf);
}
int main()
{
fin >> n >> m;
for(int i = 1 ; i <= m ; ++ i){
int a , b , c;
fin >> a >> b >> c;
cap[a][b] = c;
v[a].push_back(b);
v[b].push_back(a);
}
while(bfs()){
int flow = dfs();
while(flow > 0){
maxflow += flow;
flow = dfs();
}
}
fout << maxflow << '\n';
return 0;
}