Cod sursa(job #906870)

Utilizator batistaUPB-Oprea-Cosmin-Dumitru batista Data 7 martie 2013 12:28:18
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<cstdio>
#include<algorithm>
#include<queue>
#define N 352
#define inf 1000000
using namespace std;
struct nod
{
  int info;
  nod*adr;
}*v[N],*p;
int x,y,S,D,c,ct,i,n,m;
int cap[N][N],flux[N][N],cost[N][N],t[N],d[N];
queue<int>Q;
int bellman(int S,int D)
{
    int i,x,y,c;
    for(i=1; i<=n; i++)
    {
        t[i]=0;
        d[i]=inf;
    }
    d[S]=0;
    Q.push(S);
    while(!Q.empty())
    {
        x=Q.front();
        p=v[x];
        while(p)
        {
            y=p->info;
            c=cost[x][y];
            if( cap[x][y] > flux[x][y] && d[x]+c < d[y])
            {
                d[y]=d[x]+c;
                t[y]=x;
                Q.push(y);
            }
            p=p->adr;
        }
        Q.pop();
    }
    return t[D];
}
void ek(int S,int D)
{
    int minn,costmin=0,L[N],i;
    while(bellman(S,D))
    {
        minn=inf;
        for(i=D; i!=S; i=t[i])
            minn=min(minn, cap[t[i]][i]-flux[t[i]][i]);
        for(i=D; i!=S; i=t[i])
        {
            flux[t[i]][i]+=minn;
            flux[i][t[i]]-=minn;

        }
        costmin += minn*d[D];
    }
    printf("%d\n",costmin);
}
int main()
{
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    scanf("%d %d %d %d",&n,&m,&S,&D);
    for(i=1; i<=m; i++)
    {
        scanf("%d %d %d %d",&x,&y,&c,&ct);
        cap[x][y]=c;
        cost[x][y]=ct;
        p=new nod;
        p->info=y;
        p->adr=v[x];
        v[x]=p;
    }
    ek(S,D);
    return 0;
}