Pagini recente » Cod sursa (job #1148350) | Cod sursa (job #216694) | Cod sursa (job #1000467) | Cod sursa (job #772426) | Cod sursa (job #2821660)
#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] , n , m , maxflow;
int v[N * 10] , nxt[N * 10] , vf[N * 10] , sz;
void add(int a , int b){
vf[++ sz] = b;
nxt[sz] = v[a];
v[a] = sz;
}
bool bfs(){
fill(h , h + n + 1 , 0);
queue<int> q;
q.push(1);
h[1] = 1;
while(!q.empty()){
int x = q.front();
q.pop();
for(int i = v[x] ; i ; i = nxt[i]){
int y = vf[i];
if(!h[y] && cap[x][y] - f[x][y] > 0){
h[y] = 1 + h[x];
q.push(y);
}
}
}
return h[n] != 0;
}
int dfs(int node , int ans){
if(node == n)
return ans;
for(int i = v[node] ; i ; i = nxt[i]){
int y = vf[i];
if(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(){
fill(viz , viz + 1 + n , 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;
add(a , b);
add(b , a);
}
while(bfs()){
int flow = dfs();
while(flow > 0){
maxflow += flow;
flow = dfs();
}
}
fout << maxflow << '\n';
return 0;
}