Cod sursa(job #907249)

Utilizator batistaUPB-Oprea-Cosmin-Dumitru batista Data 7 martie 2013 19:14:03
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 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,a,b,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,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*cost[t[i]][i];
        }
    }
    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,&a,&b);
     cap[x][y]=a;
     cost[x][y]=b;
     cost[y][x]=-b;
     p=new nod;
     p->info=y; p->adr=v[x]; v[x]=p;
     p=new nod;
     p->info=x; p->adr=v[y]; v[y]=p;
    }
    ek(S,D);
    return 0;
}