Cod sursa(job #2085210)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 9 decembrie 2017 20:20:02
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 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 dist[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 bellmandford(int S,int D){
    for(int i = 1;i <= N;i++){
        dist[i] = 1 << 28;
        T[i] = 0;
    }
    dist[S] = 0;
    inQ[S] = 1;
    Q.push(S);
    while(!Q.empty()){
        int nod = Q.front();
        inQ[nod] = 0;
        Q.pop();
        for(auto it:G[nod]){
            if(F[nod][it] < C[nod][it] && dist[it] > dist[nod] + Cst[nod][it]){
                dist[it] = dist[nod] + Cst[nod][it];
                T[it] = nod;
                if(!inQ[it]){
                    inQ[it] = 1;
                    Q.push(it);
                }
            }
        }
    }
    return dist[D] != 1 << 28;
}
void maxflow(int S,int D)
{
    while(bellmandford(S,D)){
        int fmin = 1 << 30;
        int cst = 0;
        for(int nod = D;nod != S;nod = T[nod]){
            fmin = min(fmin,C[T[nod]][nod] - F[T[nod]][nod]);
            cst += Cst[T[nod]][nod];
        }
        FF += fmin;
        Fst += fmin * cst;
        for(int nod = D;nod != S;nod = T[nod]){
            F[T[nod]][nod] += fmin;
            F[nod][T[nod]] -= fmin;
        }
    }
}
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);
    }
    maxflow(S,D);
    fprintf(g,"%d",Fst);
    fclose(f);
    fclose(g);
    return 0;
}