Cod sursa(job #2088270)

Utilizator patcasrarespatcas rares danut patcasrares Data 14 decembrie 2017 21:41:33
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include<fstream>
#include<iostream>
#include<vector>
#define DN 355
#define pb push_back
#define x first
#define y second
#define DM 12505
#include<queue>
#include<cstdio>
using namespace std;
FILE *fin = fopen("fmcm.in","r");
FILE *fout = fopen("fmcm.out","w");
int n,m,s,d,dist[DN],f[DN][DN],rez,pr[DN],oldc[DN];
int g,h,c,z,fmin;
int r[DN];
int cap[DN][DN],cost[DN][DN];
vector<int >v[DN];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
bool dijkstra()
{
    int nod,cs;
    for(int i=1;i<=n;i++)
    {
        dist[i]=(1<<28);
        pr[i]=0;
    }
    dist[s]=r[s]=0;
    q.push({0,s});
    while(!q.empty())
    {
        nod=q.top().y;
        cs=q.top().x;
        q.pop();
        if(cs!=dist[nod])
            continue;
        for(auto i:v[nod])
            if(f[nod][i]<cap[nod][i])
                if(cs+cost[nod][i]+oldc[nod]-oldc[i]<dist[i])
                {
                    pr[i]=nod;
                    dist[i]=cs+cost[nod][i]+oldc[nod]-oldc[i];
                    q.push({dist[i],i});
                    r[i]=r[nod]+cost[nod][i];
                }
    }
    if(dist[d]==(1<<28))
        return 0;
    for(int i=1;i<=n;i++)
        oldc[i]=dist[i];
    nod=d;
    fmin=(1<<28);
    while(nod!=s)
    {
        fmin=min(fmin,cap[pr[nod]][nod]-f[pr[nod]][nod]);
        nod=pr[nod];
    }
    nod=d;
    while(nod!=s)
    {
        f[pr[nod]][nod]+=fmin;
        f[nod][pr[nod]]-=fmin;
        nod=pr[nod];
    }
    rez+=fmin*r[d];
    return 1;
}
int main()
{
    fscanf(fin,"%d %d %d %d",&n,&m,&s,&d);
    for(int i=1;i<=m;i++)
    {
        fscanf(fin,"%d %d %d %d",&g,&h,&c,&z);
        cap[g][h]=c;
        cost[g][h]=z;
        cost[h][g]=-z;
        v[g].pb(h);
        v[h].pb(g);
    }
    while(dijkstra());
    fprintf(fout,"%d",rez);
}