Cod sursa(job #2085439)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 10 decembrie 2017 11:04:31
Problema Flux maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.36 kb
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstdio>
using namespace std;
FILE *f = fopen("fmcm.in","r");
FILE *g = fopen("fmcm.out","w");
int C[405][405];
int F[405][405];
int Cst[405][405];
int oldD[405];
int realD[405];
int d[405];
int FF,Fst,S,D;
int N,M;
int T[405];
bool inQ[405];
queue<int> Q;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > H;
vector<int> G[405];
bool dijkstra(int S,int D){
    for(int i = 1;i <= N;i++){
        realD[i] = 0;
        d[i] = 1 << 28;
    }
    realD[S] = d[S] = 0;
    H.push({0,S});
    while(!H.empty()){
        int cst = H.top().first;
        int nod = H.top().second;
        H.pop();
        if(cst != d[nod]){
            continue;
        }
        for(auto it:G[nod]){
            if(C[nod][it] > F[nod][it]){
                int newd = d[nod] + Cst[nod][it] + oldD[nod] - oldD[it];
                if(newd < d[it]){
                    d[it] = newd;
                    H.push({d[it],it});
                    T[it] = nod;
                    realD[it] = realD[nod] + Cst[nod][it];
                }
            }
        }
    }
    if(d[D] == 1 << 28){
        return 0;
    }
    memcpy(oldD,realD,sizeof(realD));
    int fmin = 1 << 30;
    for(int i = D;i != S;i = T[i]){
        fmin = min(fmin,C[T[i]][i] - F[T[i]][i]);
    }
    FF += fmin;
    Fst += fmin * realD[D];
    for(int i = D;i != S;i = T[i]){
        F[T[i]][i] += fmin;
        F[i][T[i]] -= fmin;
    }
    return 1;
}
void BellmanFord(int S,int D){
    for(int i = 1; i <= N;i++){
        oldD[i] = 1<<28;
    }
    oldD[S] = 0;
    while(!Q.empty()){
        int nod = Q.front();
        Q.pop();
        inQ[nod] = 0;
        for(auto it:G[nod]){
            if(F[nod][it] < C[nod][it] && oldD[it] > oldD[nod] + Cst[nod][it]){
                oldD[it] = oldD[nod] + Cst[nod][it];
                if(!inQ[it]){
                    Q.push(it);
                    inQ[it] = 1;
                }
            }
        }
    }
}
int main()
{
    fscanf(f,"%d %d %d %d",&N,&M,&S,&D);
    for(int i = 1;i <= M;i++){
        int x,y;
        fscanf(f,"%d %d",&x,&y);
        fscanf(f,"%d %d",&C[x][y],&Cst[x][y]);
        Cst[y][x] = -Cst[x][y];
        G[x].push_back(y);
        G[y].push_back(x);
    }
 ///   BellmanFord(S,D);
    while(dijkstra(S,D));
    fprintf(g,"%d",Fst);
    fclose(f);
    fclose(g);
    return 0;
}