Cod sursa(job #2135703)

Utilizator bleo16783FMI Bleotiu Cristian bleo16783 Data 19 februarie 2018 08:04:48
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
#define N 400
#define inf 9999999
#define pb push_back
#define s second
#define f first
#define mp make_pair
int viz[N],t[N],n,S,D,m,i,j,x,y,z,F[N][N],C[N][N],d[N],fm,cst[N][N],ans,c;
///F[i][j] fluxul de pe muchia i j
///C[i][j] capacitatea de pe muchia i j
///cst[i][j] costul de pe muchia i j
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >h;
vector<int>a[N];
bool dijkstra()
{
    memset(t,0,sizeof(t));
    memset(viz,0,sizeof(viz));
    memset(d,inf,sizeof(d));
    t[S]=-1;
    d[S]=0;
    viz[S]=1;
    h.push(mp(0,S));
    while(!h.empty())
    {
        x=h.top().s;c=h.top().f;
        h.pop();
        if(c!=d[x]||x==D)continue;
        for(i=0;i<a[x].size();++i)
        {
            y=a[x][i];
            if(C[x][y]>F[x][y] && d[x]+cst[x][y]<d[y])
            {
                d[y]=d[x]+cst[x][y];
                t[y]=x;
                if(!viz[y])
                {
                    h.push(mp(d[y],y));
                    viz[y]=1;
                }
            }
        }
    }
    return viz[D];
}
int main()
{
    ifstream f("fmcm.in");
    f>>n>>m>>S>>D;
    for(i=0;i<m;++i)
    {
        f>>x>>y>>c>>z;
        a[x].pb(y);
        a[y].pb(x);
        cst[x][y]=z;
        cst[y][x]=-z;
        C[x][y]=c;
    }

    while(dijkstra())
    {
            fm=inf;
            for(j=D;j!=S;j=t[j])
                fm=min(fm,C[t[j]][j]-F[t[j]][j]);
            if(!fm)continue;
            for(j=D;j!=S;j=t[j])
            {
                F[t[j]][j]+=fm;
                F[j][t[j]]-=fm;
                ans+=fm*cst[t[j]][j];
            }
    }
    ofstream g("fmcm.out");
    g<<ans;
    return 0;
}