Cod sursa(job #2124493)

Utilizator alexilasiAlex Ilasi alexilasi Data 7 februarie 2018 11:41:36
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<stdio.h>
#define N 800000
#define INF 2000000000
int sol,n,m,i,s,d,u,w,*v,cp,fl,cs,cu,cm[351],first,last,
co[N],mark[351],dad[351],vec[351][351],gr[351];
short int c[351][351],C[351][351];
void readd(),flux();
int main()
{
    readd();
    flux();
    printf("%d\n",sol);
    return 0;
}
void readd()
{   v=new int;
    freopen("fmcm.in","r",stdin);
    scanf("%d%d%d%d",&n,&m,&s,&d);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d%d",&u,&w,&cp,&cs);
        c[u][w]=cp;C[u][w]=cs;C[w][u]=-cs;
        vec[u][gr[u]++]=w;vec[w][gr[w]++]=u;
    }
    freopen("fmcm.out","w",stdout);
}
void flux()
{
    for(;;)
    {
        for(i=1;i<=n;i++)cm[i]=INF;
        cm[s]=0;first=last=1;co[1]=s;mark[s]=1;
        while(first<=last)
        {
            u=co[first++];cu=cm[u];mark[u]=0;
            for(v=vec[u];*v;v++)
                if(c[u][*v]&&cu+C[u][*v]<cm[*v])
                    {
                        cm[*v]=cu+C[u][*v];
                        dad[*v]=u;
                        if(!mark[*v]){mark[*v]=1;co[++last]=*v;}
                    }
        }
        if(cm[d]==INF)return;
        fl=INF;
        for(u=d;u!=s;u=dad[u])fl=(fl<c[dad[u]][u])?fl:c[dad[u]][u];
        for(u=d;u!=s;u=dad[u]){c[dad[u]][u]-=fl;c[u][dad[u]]+=fl;}
        sol+=fl*cm[d];
    }
}