Pagini recente » Cod sursa (job #1248939) | Cod sursa (job #2129928) | Cod sursa (job #114308) | Cod sursa (job #2093543) | Cod sursa (job #3338016)
#include <bits/stdc++.h>
using namespace std;
int fr[1005],level[1005],cap[1005][1005],N,M;
int i,j,a,b,c,x,ans,gain;
vector<int> A[1005];
deque<int> dq;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
void bfs(int start){
for (int i = 1;i <= N;i++){
fr[i] = 0;
level[i] = 0;
}
level[start] = 1;
dq.push_back(start);
while (!dq.empty()){
a = dq.front();
dq.pop_front();
for (auto b : A[a])
if (cap[a][b] != 0 && level[b] == 0){
level[b] = level[a]+1;
dq.push_back(b);
}
}
}
int dfs(int k,int mini){
if (k == N || mini == 0)
return mini;
while (fr[k] < A[k].size()){
int next_k = A[k][fr[k]];
if (cap[k][next_k] != 0 && level[next_k] == level[k] + 1){
x = dfs(next_k,min(mini,cap[k][next_k]));
if (x > 0){
cap[k][next_k] -= x;
cap[next_k][k] += x;
return x;
}
else
fr[k]++;
}
else
fr[k]++;
}
return 0;
}
bool flux(int start){
bfs(start);
if (level[N] == 0)
return 0;
gain = 0;
while (true){
x = dfs(1,1e9);
if (x == 0)
break;
gain += x;
}
ans += gain;
return gain;
}
int main()
{
fin >> N >> M;
for (i = 1;i <= M;i++){
fin >> a >> b >> c;
A[a].push_back(b);
A[b].push_back(a);
cap[a][b] = c;
}
while (flux(1));
fout << ans;
return 0;
}