Cod sursa(job #2197440)

Utilizator andreiudilaUdila Andrei andreiudila Data 22 aprilie 2018 10:37:21
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream cin("fmcm.in");
ofstream cout("fmcm.out");

vector<int> v[400];
int cap[400][400];
int cost[400][400],t[400],dmin[400];
int q[130000],viz[400];
int x,y,c,z,n,m,s,d,i,j,flux,costf;
int inf = 2000000000;
int cmin = inf;
bool drum_minim(int s, int d)
{
    memset(viz,0,sizeof(viz));
    viz[s]=1;
    int st = 1,en=1;
    q[st] = s;
    t[s]=-1;
    dmin[s]=0;
    for(int i=1; i<=n; ++i)
        if(i!=s)
            dmin[i]=inf;

    while(st<=en)
    {
        int nod = q[st];
        ++st;
        viz[nod]=0;

        for(int i=0; i<v[nod].size(); ++i)
        {
            if(cap[nod][v[nod][i]] > 0
                    && dmin[nod] + cost[nod][v[nod][i]] < dmin[v[nod][i]])
            {
                dmin[v[nod][i]] = dmin[nod] + cost[nod][v[nod][i]];
                if(!viz[v[nod][i]])
                {
                    ++en;
                    q[en]=v[nod][i];
                    viz[v[nod][i]]=1;
                }
                t[v[nod][i]] = nod;
            }
        }
    }

    if(dmin[d] != inf) return 1;
    return 0;
}
int main()
{
    cin>>n>>m>>s>>d;
    for(i=1; i<=m; ++i)
    {
        cin>>x>>y>>c>>z;
        v[x].push_back(y);
        cap[x][y]=c;
        cost[x][y]=z;
        v[y].push_back(x);
        cap[y][x]=0;
        cost[y][x]=-z;
    }

    int nod = d;
    while(drum_minim(s,d))
    {
        nod = d;
        cmin = inf;
        while(nod != s)
        {
            cmin = min(cmin,cap[t[nod]][nod]);
            nod = t[nod];
        }

        flux += cmin;
        costf += dmin[d]*cmin;

        nod = d;
        while(nod !=s)
        {
            cap[nod][t[nod]] += cmin;
            cap[t[nod]][nod] -= cmin;
            nod = t[nod];
        }

    }

    cout<<costf;
    return 0;
}