Cod sursa(job #297782)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 5 aprilie 2009 16:42:48
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include <stdio.h>
#define Lg 355
#define infinit 60000000LL

using namespace std;

struct nod
{
     int inf;
     nod *next;
}*sir[Lg];

int cap[Lg][Lg],cost[Lg][Lg];
int n,m,S,D,rez,inc,sf,Cost_aux;
int Q[Lg*Lg],viz[Lg],tati[Lg],Cost[Lg];

int minim(int a,int b)
{
     return a>b?b:a;
}

void adauga(int a,int b)
{
     nod *q=new nod;
     q->inf=b;
     q->next=sir[a];
     sir[a]=q;
}

void citire()
{
     freopen ("fmcm.in","r",stdin);
     freopen ("fmcm.out","w",stdout);

     int x,y,c,cos;
     scanf ("%d %d %d %d",&n,&m,&S,&D);
     for (int i=0;i<m;i++)
     {
          scanf ("%d %d %d %d",&x,&y,&c,&cos);
          adauga(x,y);
          adauga(y,x);
          cap[x][y]=c;
          cost[x][y]=cos;
          cost[y][x]=-cos;
     }
}

void bell_BMW()
{
     for (int  i=1;i<=n;i++)
     {
          Cost[i]=infinit;
          tati[i]=-1;
     }
     inc=0;
     sf=1;
     Q[inc]=S;
     Cost[S]=0;
     viz[S]=1;
     while (inc<sf)
     {
          int N=Q[inc];
          viz[N]=0;
          inc++;
          Cost_aux=Cost[N];
          for (nod *q=sir[N];q;q=q->next)
               if (cap[N][q->inf] && Cost[q->inf]>Cost_aux+cost[N][q->inf])
               {
                    Cost[q->inf]=Cost_aux+cost[N][q->inf];
                    tati[q->inf]=N;
                    if (!viz[q->inf])
                    {
                         viz[q->inf]=1;
                         Q[sf++]=q->inf;
                    }
               }
     }
}

void fmcm()
{
     int flux,poz;
     bell_BMW();
     while (Cost[D]!=infinit)
     {
          flux=infinit;
          poz=D;
          while (poz!=S)
          {
               flux=minim(flux,cap[tati[poz]][poz]);
               poz=tati[poz];
          }

          poz=D;
          while (poz!=S)
          {
               cap[tati[poz]][poz]-=flux;
               cap[poz][tati[poz]]+=flux;
               poz=tati[poz];
          }
          rez+=flux*Cost[D];
          bell_BMW();
     }
}

int main ()
{
     citire();
     fmcm();
     printf("%d\n",rez);
     return 0;
}