Cod sursa(job #928389)

Utilizator misinozzz zzz misino Data 26 martie 2013 13:52:55
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 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,costm,y,s,cap,dest,m,q[35500],viz[355],d[400],t[355],c[355][355],fl[355][355],cost[355][355];
//long long
struct muu{int x,y,c;};
muu mu[12505];
bool bfs()
{
    int i,p,u,x;
    for(i=1;i<=n;++i)
    d[i]=MUUU,t[i]=0;
    d[s]=0;
    q[1]=s;
    t[s]=0;
    viz[s]=1;
    p=u=1;
    while(p<=u)
    {
        x=q[p];
        ++p;
        viz[x]=0;
        for(i=1;i<=n;++i)
//        if(c[x][i]!=fl[x][i])
        if(d[i]>d[x]+cost[x][i]&&c[x][i]>fl[x][i])
        {
            d[i]=d[x]+cost[x][i];
            t[i]=x;
            if(!viz[i])
            {
                ++u;
                q[u]=i;
                viz[i]=1;
            }
        }
    }
    if(t[dest])
    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;
        cost[mu[i].x][mu[i].y]=mu[i].c;
        cost[mu[i].y][mu[i].x]=-mu[i].c;
    }
    while(bfs())
    {
        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;
        costm+=mini*d[dest];
    }
    g<<costm<<'\n';
    return 0;
}