Cod sursa(job #928286)

Utilizator misinozzz zzz misino Data 26 martie 2013 13:14:19
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<fstream>
#include<cstring>
#define MUUU 999999999
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int i,n,x,mini,flux,cost,y,s,cap,dest,m,d[400],t[355],c[355][355],fl[355][355];
struct muu{int x,y,c;};
muu mu[12505];
bool bf()
{
    int i,j,co,k,okmu=1,p,nr;
    for(i=1;i<=n;++i)
    d[i]=MUUU;
    d[s]=0;
    memset(t,0,sizeof(t));
    t[s]=-1;
    for(nr=1;okmu&&nr<n;++nr)
    {
        okmu=0;
        for(k=1;k<=m;++k)
        {
            i=mu[k].x;
            j=mu[k].y;
            co=mu[k].c;
            if(c[i][j]>fl[i][j]&&d[j]>d[i]+co&&t[i])
            {
                d[j]=d[i]+co;
                t[j]=i;
                okmu=1;
            }
            if(c[j][i]<fl[j][i]&&d[i]>d[j]-co&&t[j])
            {
                d[i]=d[j]-co;
                t[i]=j;
                okmu=1;
            }
        }
    }
    if(d[dest]<MUUU)
    {
        return 1;
    }
    return 0;
}
int main()
{
    f>>n>>m>>s>>dest;
    for(i=1;i<=m;++i)
    {
        f>>mu[i].x>>mu[i].y>>cap>>mu[i].c;
        c[mu[i].x][mu[i].y]=cap;
    }
    while(bf())
    {
        mini=MUUU;
        i=dest;
        while(i!=s)
        {
            mini=min(mini,c[t[i]][i]-fl[t[i]][i]);
            i=t[i];
        }
        if(mini==0)
        continue;
        i=dest;
        while(i!=s)
        {
            fl[t[i]][i]+=mini;
            fl[i][t[i]]-=mini;
            i=t[i];
        }
        flux+=mini;
        cost+=mini*d[dest];
    }
    g<<cost<<'\n';
    return 0;
}