Pagini recente » Cod sursa (job #3162701) | Clasamentul arhivei educationale | Cod sursa (job #555996) | Cod sursa (job #550349) | Cod sursa (job #915489)
Cod sursa(job #915489)
#include<cstdio>
#include<cassert>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
int n, m, source, dest, cap[505][505];
void read(){
assert(freopen("maxflow.in", "r", stdin));
scanf("%d%d", &n, &m);
dest = n;
source = 1;
for(int i = 1; i <= m; ++i){
int aux_x, aux_y, aux_cap;
scanf("%d%d%d", &aux_x, &aux_y, &aux_cap);
cap[aux_x][aux_y] = aux_cap;
}
}
int dad[505], vis[505], fl[505][505];
int bfs(){
memset(dad, 0, sizeof(dad));
memset(vis, 0, sizeof(vis));
dad[source] = -1;
queue<int> q;
q.push(source);
vis[source] = 1;
while(!q.empty()){
int now = q.front();
q.pop();
for(int i = 1; i <= dest; ++i)
if(fl[now][i] < cap[now][i] && !vis[i]){
q.push(i);
vis[i] = 1;
dad[i] = now;
}
if(vis[dest])
return 1;
}
return 0;
}
int flow;
void solve(){
while(bfs()){
int c_flow;
for(int i = 1; i < dest; ++i)
if(vis[i] && cap[i][dest] > fl[i][dest]){
c_flow = cap[i][dest] - fl[i][dest];
for(int j = i; j != source; j = dad[j])
c_flow = min(c_flow, cap[dad[j]][j] - fl[dad[j]][j]);
for(int j = i; j != source; j = dad[j]){
fl[dad[j]][j] += c_flow;
fl[j][dad[j]] -= c_flow;
}
fl[i][dest] += c_flow;
fl[dest][i] -= c_flow;
flow += c_flow;
}
}
}
void write(){
assert(freopen("maxflow.out", "w", stdout));
printf("%d", flow);
}
int main(){
read();
solve();
write();
return 0;
}