Cod sursa(job #1455832)

Utilizator usermeBogdan Cretu userme Data 29 iunie 2015 11:23:13
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.21 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>

using namespace std;

const int MAXN=350,INF=2000000000;

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

int N, M;

vector<int> graf[1 + MAXN];

int S, D;

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

struct Nod {
    int index, cost;

    const bool operator < (const Nod &b) const {
        return this->cost < b.cost;
    }
};

priority_queue<Nod> q;
int fost[1 + MAXN];

int fluxtotal,costtotal;

bool bfs(){
    memset(fost,0,sizeof(fost));
    q.push(Nod({S, 0}));
    fost[S]=S;
    while ( q.size()>0 ){
        int nod=q.top().index;
        int costcurent=-q.top().cost;
        q.pop();
        for ( int i=0;i<(int)graf[nod].size();++i ){
            int vecin=graf[nod][i];
            if (!fost[vecin]&&capacitate[nod][vecin]-flux[nod][vecin] > 0){
                q.push(Nod{vecin,-(costcurent+cost[nod][vecin])});
                fost[vecin]=nod;
            }
        }
    }
    return fost[D] > 0;
}

int main(void) {
    int i;
    fscanf(f,"%d%d%d%d", &N, &M, &S, &D);
    for (i = 0; i < M; ++i) {
        int x, y, fl, co;
        fscanf(f,"%d%d%d%d", &x, &y, &fl, &co);
        graf[x].push_back(y);
        capacitate[x][y] = fl;
        cost[x][y]=co;
        cost[y][x]=-co;
    }
    while ( bfs() ){
        int nod=D;
        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=D;
        while (nod != fost[nod]){
            flux[fost[nod]][nod] += mincapacitate;
            flux[nod][fost[nod]] -= mincapacitate;
            nod=fost[nod];
        }
    }
    for ( int i=1;i<=N;++i ){
        fluxtotal+=flux[S][i];
    }
    for ( int i=1;i<=N;++i ){
        for ( int j=1;j<=N;++j ){
            if ( flux[i][j]>0 )
                costtotal+=flux[i][j]*cost[i][j];
        }

    }

    //fprintf(h,"%d\n", fluxtotal);
    fprintf(h,"%d\n", costtotal);
    return 0;
}