Pagini recente » Istoria paginii utilizator/rradu_v2 | Istoria paginii utilizator/sorinasmeureanu | Profil test.php | Monitorul de evaluare | Cod sursa (job #2887029)
#include <bits/stdc++.h>
#define inf (1<<30)
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int const N = 1001;
int n , m , x , y , z;
int lv[N] , viz[N];
int f[N][N];
vector<int> v[N];
bool bfs(){
fill(lv , lv + 1 + n , 0);
queue<int> q;
q.push(1);
lv[1] = 1;
while(!q.empty()){
int x = q.front();
q.pop();
for(auto y : v[x]){
if(!lv[y] && f[x][y] > 0){
lv[y] = 1 + lv[x];
q.push(y);
}
}
}
return lv[n] != 0;
}
int dfs(int x , int fl){
if(x == n) return fl;
int ans = INT_MAX;
for(auto y : v[x]){
if(lv[y] == lv[x] + 1 && f[x][y] > 0){
int flow = dfs(y , min(fl , f[x][y]));
if(flow > 0){
f[x][y] -= flow;
f[y][x] += flow;
//lv[y] = inf;
return flow;
}
lv[y] = inf;
}
}
return 0;
}
int main()
{
fin >> n >> m;
for(int i = 1 ; i <= m ; ++ i){
fin >> x >> y >> z;
f[x][y] += z;
v[x].push_back(y);
v[y].push_back(x);
}
int ans = 0;
while(true){
if(!bfs()){
break;
}
int flow = 0;
do{
flow = dfs(1 , INT_MAX);
ans += flow;
}while(flow);
}
fout << ans << '\n';
return 0;
}