Cod sursa(job #392970)

Utilizator jupanubv92Popescu Marius jupanubv92 Data 8 februarie 2010 17:46:50
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include<stdio.h>
#define INF 10000001
#include<string.h>
#define Nmx 357

int Cp[Nmx][Nmx],ok,Cost[Nmx][Nmx],F[Nmx][Nmx];
int n,m,s,d,viz[Nmx];
int dist[Nmx],prec[Nmx];
struct nod
{
    int inf;
    nod *urm;
};
nod *G[Nmx];

void add(int x,int y)
{
    nod *aux=new nod;
    aux->inf=y;
    aux->urm=G[x];
    G[x]=aux;
}

void citire()
{
    scanf("%d%d%d%d",&n,&m,&s,&d);
    int x,y,c,cst;
    for(int i=1;i<=m;++i)
    {
        scanf("%d%d%d%d",&x,&y,&c,&cst);
        add(x,y);
        add(y,x);
        Cp[x][y]=c;
        Cost[x][y]=cst;
        Cost[y][x]=-cst;
    }
}

int belmand()
{
    int Q[100001],st,dr;
    for(int i=1;i<=n;++i)
    {
        dist[i]=INF;
        prec[i]=-1;
    }
    dist[s]=0;
    st=dr=1;
    Q[st]=s;
    memset(viz,0,sizeof(viz));
    viz[s]=1;
    while(st<=dr)
    {
        viz[Q[st]]=0;
        for(nod *p=G[Q[st]];p;p=p->urm)
        {
            int x=Q[st];
            int y=p->inf;
            if(Cp[x][y]-F[x][y]>0&&Cost[x][y]+dist[x]<dist[y])
            {
                dist[y]=Cost[x][y]+dist[x];
                prec[y]=x;
                if(!viz[y])
                {
                    Q[++dr]=y;
                    viz[y]=1;
                }
            }
        }
        ++st;
    }
    if(dist[d]!=INF)
    {
        ok=1;
        int Vmin=INF;
        for(int i=d;i!=s;i=prec[i])
            if(Cp[prec[i]][i]-F[prec[i]][i]<Vmin)
                Vmin=Cp[prec[i]][i]-F[prec[i]][i];
        for(int i=d;i!=s;i=prec[i])
        {
            F[prec[i]][i]+=Vmin;
            F[i][prec[i]]-=Vmin;
        }
        return Vmin*dist[d];
    }
    else return 0;
}

void solve()
{
    long long rez=0;
    ok=1;
    while(ok)
    {
        ok=0;
        rez+=belmand();
    }
    printf("%lld\n",rez);
}

int main()
{
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    citire();
    solve();
    return 0;
}