Cod sursa(job #1267675)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 20 noiembrie 2014 08:33:09
Problema Flux maxim de cost minim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.38 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define inf (1<<29)

using namespace std;

ifstream fin ("fmcm.in");
ofstream fout ("fmcm.out");

vector <int> l[355];

priority_queue<pair<int,int>,vector<pair< int,int> >,greater<pair <int, int> > >H;

queue <int> q;

int n,m,C,z,S,D,i,nod,fr,sc,cst,sol,x,y,minim;

int d[355],e[355],r[355],t[355],c[355][355],f[355][355],cost[355][355];

bool viz[355];

void BF () {
    q.push(S);
    for (i=1;i<=n;i++)
        r[i]=inf;
    r[S]=0;
    while (q.size()) {
        nod=q.front();
        q.pop();
        viz[nod]=0;
        for (int i=0;i<l[nod].size();i++) {
            fr=l[nod][i]; sc=cost[nod][fr];
            if (c[nod][fr]>f[nod][fr] && r[fr]>r[nod]+sc) {
                r[fr]=r[nod]+sc;
                if (!viz[fr]){
                    viz[fr]=1;
                    q.push(fr);
                }
            }
        }
    }
}

bool dijkstra () {

   // memset(viz,0,sizeof(viz));
    for (int i=1;i<=n;i++)
        d[i]=inf;
    d[S]=e[S]=0;
    H.push(make_pair(0,S));
    while (!H.empty()) {
        while (!H.empty() && viz[H.top().second])
            H.pop();
        if (H.empty())
            break;
        nod=H.top().second;
        cst=H.top().first;
        viz[nod]=1;
        d[nod]=cst;
        H.pop();
        for (int i=0;i<l[nod].size();i++)
            if (c[nod][l[nod][i]]>f[nod][l[nod][i]] && d[nod]+cost[nod][l[nod][i]]+r[nod]-r[l[nod][i]]<d[l[nod][i]]) {
                H.push(make_pair(d[nod]+cost[nod][l[nod][i]]+r[nod]-r[l[nod][i]],l[nod][i]));
                d[l[nod][i]]=d[nod]+cost[nod][l[nod][i]]+r[nod]-r[l[nod][i]];
                e[l[nod][i]]=e[nod]+cost[nod][l[nod][i]];
                t[l[nod][i]]=nod;
            }
    }
    memcpy(r,e,sizeof(e));
    return (d[D]!=inf);
}

int main () {

    fin>>n>>m>>S>>D;

    for (i=1;i<=m;i++) {
        fin>>x>>y>>C>>z;
        l[x].push_back(y);
        l[y].push_back(x);
        c[x][y]=C;
        cost[x][y]=z;
        cost[y][x]=-z;
    }

    BF();

    while (dijkstra()) {
        minim=inf;
        for (i=D;i!=S;i=t[i])
            minim=min(minim,c[t[i]][i]-f[t[i]][i]);
        sol+=minim*r[D];
        for (i=D;i!=S;i=t[i]){
            f[t[i]][i]+=minim;
            f[i][t[i]]-=minim;
        }
    }

    fout<<sol<<"\n";

    return 0;
}