Cod sursa(job #714247)

Utilizator PetcuIoanPetcu Ioan Vlad PetcuIoan Data 15 martie 2012 16:37:52
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#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;
            }
    }

    return vis[verts];
}

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;
}