Cod sursa(job #2085436)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 10 decembrie 2017 11:01:39
Problema Adapost Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 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];
void bellmanford(int S,int D){
    for(int i = 1;i <= N;i++){
        oldd[i] = 1 << 28;
    }
    oldd[S] = 0;
    inQ[S] = 1;
    Q.push(S);
    while(!Q.empty()){
        int nod = Q.front();
        Q.pop();
        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]){
                    inQ[it] = 1;
                    Q.push(it);
                }
            }
        }
    }
}
bool dijkstra(int S,int D){
    for(int i = 1;i <= N;i++){
        dist[i] = 1 << 28;
        T[i] = 0;
    }
    dist[S] = 0;
    H.push({0,S});
    while(!H.empty()){
        int nod = H.top().second;
        int cst = H.top().first;
        H.pop();
        if(cst != dist[nod]){
            continue;
        }
        for(auto it:G[nod]){
            if(F[nod][it] < C[nod][it]){
                int newd = dist[nod] + oldd[nod] + Cst[nod][it] - oldd[it];
                if(newd < dist[it]){
                    dist[it] = newd;
                    T[it] = nod;
                    reald[it] = Cst[nod][it] + reald[nod];
                    H.push({dist[it],it});
                }
            }
        }
    }
    if(dist[D] == 1 << 28){
        return 0;
    }
    memcpy(oldd,reald,sizeof(reald));
    int fmin = 1 << 30;
    for(int nod = D;nod != S;nod = T[nod]){
        fmin = min(fmin,C[T[nod]][nod] - F[T[nod]][nod]);
    }
    FF += fmin;
    Fst += reald[D] * fmin;
    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);
    }
    bellmanford(S,D);
    while(dijkstra(S,D));
    fprintf(g,"%d",Fst);
    fclose(f);
    fclose(g);
    return 0;
}