Pagini recente » Cod sursa (job #1899688) | Prezentare infoarena | Cod sursa (job #2765796) | Cod sursa (job #2184730) | Cod sursa (job #714249)
Cod sursa(job #714249)
#include<stdio.h>
#include<assert.h>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int knmax = 1023, ko9k = 900000000;
int verts, edges, sol, vis[knmax], dad[knmax], cap[knmax][knmax], fl[knmax][knmax];
void read(){
assert(freopen("maxflow.in","r",stdin)!=NULL);
int i, aux_x, aux_y, aux_c;
scanf("%d%d",&verts,&edges);
for(i = 1; i <= edges; ++i){
scanf("%d%d%d", &aux_x, &aux_y, &aux_c);
cap[aux_x][aux_y] = aux_c;
}
}
void init(){
int i;
for(i = 1; i <= verts; ++i)
vis[i] = 0;
}
int bfs(){
init();
int now = 1, i;
queue<int> q;
q.push(now);
while(!q.empty()){
now = q.front();
q.pop();
for(i = 1; i <= verts; ++i)
if(!vis[i] && fl[now][i] < cap[now][i]){
vis[i] = 1;
q.push(i);
dad[i] = now;
if(i == verts)
return 1;
}
}
return 0;
}
void solve(){
int c_flow = ko9k, i;
while(bfs()){
c_flow = ko9k;
for(i = verts; i != 1; i = dad[i])
c_flow = min(c_flow, cap[dad[i]][i] - fl[dad[i]][i]);
sol += c_flow;
for(i = verts; i != 1; i = dad[i]){
fl[dad[i]][i] += c_flow;
fl[i][dad[i]] -= c_flow;
}
}
}
void write(){
assert(freopen("maxflow.out","w",stdout)!=NULL);
printf("%d",sol);
}
int main(){
read();
solve();
write();
return 0;
}