Cod sursa(job #2419248)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 7 mai 2019 21:19:31
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>
#include <vector>
#include <deque>
#include <cstring>
#define DIM 360
#define INF 2000000000
using namespace std;

ifstream fin ("fmcm.in");
ofstream fout ("fmcm.out");
vector <int> L[DIM];
deque <int> q;
int viz[DIM],d[DIM],t[DIM],c[DIM][DIM],f[DIM][DIM],cst[DIM][DIM];
int n,m,i,j,s,dest,x,y,cost,capacitate,sol,dif;
inline int bellmanFord (){
    for (int i=1;i<=n;i++)
        d[i] = INF;
    memset (viz,0,sizeof(viz));
    memset (t,0,sizeof(t));
    q.clear();
    q.push_back (s);
    viz[s] = 1;
    d[s] = 0;
    while (!q.empty()){
        int nod = q.front();
        q.pop_front();
        viz[nod] = 0;
        for (int i=0;i<L[nod].size();i++){
            int vecin = L[nod][i];
            if (c[nod][vecin] > f[nod][vecin] && d[nod]+cst[nod][vecin] < d[vecin]){
                d[vecin] = d[nod]+cst[nod][vecin];
                t[vecin] = nod;
                if (!viz[vecin]){
                    q.push_back (vecin);
                    viz[vecin] = 1;
                }}}}

    return (d[dest] != INF);
}
int main (){

    fin>>n>>m>>s>>dest;
    for (i=1;i<=m;i++){
        fin>>x>>y>>capacitate>>cost;
        L[x].push_back(y);
        L[y].push_back(x);
        c[x][y] = capacitate;
        cst[x][y] = cost, cst[y][x] = -cost;
    }

    while (bellmanFord()){

        /// fac cele doua parcurgeri ale vectorului de tati

        x = dest;
        dif = INF;
        while (x != s){
            dif = min (dif,c[t[x]][x]-f[t[x]][x]);
            x = t[x];
        }

        x = dest;
        while (x != s){
            f[t[x]][x] += dif;
            f[x][t[x]] -= dif;
            sol += cst[t[x]][x]*dif;
            x = t[x];
        }}

    fout<<sol;


    return 0;
}