Cod sursa(job #1455830)

Utilizator usermeBogdan Cretu userme Data 29 iunie 2015 11:20:11
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;

const int MAXN=1000,INF=3000001;

FILE* f = fopen("maxflow.in","r");
FILE* h = fopen("maxflow.out","w");

int N, M;

vector<int> graf[1 + MAXN];

int capacitate[1 + MAXN][1 + MAXN];
int flux[1 + MAXN][1 + MAXN];

int q[1+MAXN],st,dr;
int fost[1+MAXN];

int fluxtotal;

bool bfs(){
    st=0;
    dr=0;
    memset(fost,0,sizeof(fost));
    q[0]=1;
    fost[1]=1;
    while ( st<=dr ){
        int nod=q[st];
        ++st;
        for ( int i=0;i<graf[nod].size();++i ){
            int vecin = graf[nod][i];
            if ( !fost[vecin]&&capacitate[nod][vecin]-flux[nod][vecin]>0 ){
                q[++dr]=vecin;
                fost[vecin]=nod;
            }
        }
    }
    return fost[N]!=0;
}

int main(void) {
    int i;
    fscanf(f,"%d%d", &N, &M);
    for (i = 0; i < M; ++i) {
        int x, y, fl;
        fscanf(f,"%d%d%d", &x, &y, &fl);
        graf[x].push_back(y);
        capacitate[x][y] = fl;
    }
    while ( bfs() ){
        int nod=N;
        int mincapacitate = INF;
        while (nod != fost[nod]){
            if (capacitate[fost[nod]][nod]-flux[fost[nod]][nod] < mincapacitate)
                mincapacitate = capacitate[fost[nod]][nod]-flux[fost[nod]][nod];
            nod = fost[nod];
        }
        nod=N;
        while (nod != fost[nod]){
            flux[fost[nod]][nod] += mincapacitate;
            flux[nod][fost[nod]] -= mincapacitate;
            nod=fost[nod];
        }
    }
    for ( int i=1;i<=N;++i )
        //if ( flux[1][i]>0 )
            fluxtotal+=flux[1][i];
    fprintf(h,"%d\n", fluxtotal);
    return 0;
}