Cod sursa(job #2125086)

Utilizator alexandruilieAlex Ilie alexandruilie Data 7 februarie 2018 22:24:56
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.31 kb
#include <fstream>
#define nmax 351
#define inf 2e9
#include <vector>
#include <queue>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
vector <int> v[nmax];
int C[nmax][nmax],F[nmax][nmax],cost[nmax][nmax],t[nmax],di[nmax],viz[nmax],dist[nmax],dist2[nmax],n,m,s,d,a,b,c,z,FC,ans;
priority_queue <pair<int,int>,vector <pair<int,int> >,greater <pair<int,int> > > h;
int dijkstra()
{
    int i,nod,cst,vec;
    for(i=1;i<=n;i++) {t[i]=0;di[i]=inf;}
    h.push({0,s});
    di[s]=dist2[s]=0;
    t[s]=-1;
    while(!h.empty())
    {
        cst=h.top().first;
        nod=h.top().second;
        h.pop();
        if(nod == d || cst!=di[nod])
            continue;
        for(i=0;i<v[nod].size();i++)
        {
            vec=v[nod][i];
            if(di[vec]>cst+cost[nod][vec]+dist[nod]-dist[vec]&&C[nod][vec]>F[nod][vec])
            {
                t[vec]=nod;
                di[vec]=cst+cost[nod][vec]+dist[nod]-dist[vec];
                dist2[vec]=dist2[nod]+cost[nod][vec];
                h.push({di[vec],vec});

            }
        }
    }
    for(int i=1;i<=n;i++) dist[i]=dist2[i];
    if(t[d]) return 1;
    return 0;
}
void bellmanford()
{
    int i,nod,cst,vec;
    for(i=1;i<=n;i++) dist[i]=inf;
    dist[s]=0;
    viz[s]=1;
    queue <int> q;
    q.push(s);
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        viz[nod]=0;
        for(i=0;i<v[nod].size();i++)
        {
            vec=v[nod][i];cst=cost[nod][vec];
            if(dist[vec]>cst+dist[nod]&&C[nod][vec]>F[nod][vec])
            {
                dist[vec]=cst+dist[nod];
                if(vec!=d&&!viz[vec]) {viz[vec]=1;q.push(vec);}
            }
        }
    }
}
int main()
{
    int i,vec,j;
    f>>n>>m>>s>>d;
    for(i=1;i<=m;i++)
    {
        f>>a>>b>>c>>z;
        v[a].push_back(b);
        //v[b].push_back(a);
        C[a][b]=c;
        cost[a][b]=z;
       // cost[b][a]=-z;
    }
    bellmanford();
    while(dijkstra())
    {
        FC=inf;
         for(j=d;j!=s;j=t[j])
            FC=min(FC,C[t[j]][j]-F[t[j]][j]);
            for(j=d;j!=s;j=t[j])
            {
                F[t[j]][j]+=FC;
                F[j][t[j]]-=FC;
                ans+=FC*cost[t[j]][j];
            }
        }
        g<<ans;
    return 0;
}