Cod sursa(job #567832)

Utilizator irene_mFMI Irina Iancu irene_m Data 30 martie 2011 15:26:51
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.58 kb
#include <cstdio>
#include <cstring>
#define MaxN 355
#define MAX 1000005
#define Inf 2000000000
#define infile "fmcm.in"
#define outfile "fmcm.out"

struct edge{
      int x;
      edge *next;
}     *G[MaxN];

int cap[MaxN][MaxN],cost[MaxN][MaxN],b[MaxN][MaxN];
int t[MaxN],Q[MAX],uz[MaxN];
int N,M,S,D,sw=1,min;
long long CT,dist[MaxN];

void add(int x,int y)
{
      edge *q=new edge;
      q->x=y; q->next=G[x]; G[x]=q;
}

void read()
{
      int i,x,y,c,z;
      scanf("%d%d%d%d",&N,&M,&S,&D);
      for(i=1;i<=M;i++)
      {
            scanf("%d%d%d%d",&x,&y,&c,&z);
            add(x,y); add(y,x);
            cap[x][y]=c; cost[x][y]=z;
            cost[y][x]=-z;
      }
}

void BF()
{
      int i,p=1;
      edge *q;
      for(i=1;i<=N;i++)
            dist[i]=Inf, t[i]=-1;
     sw=0;
     dist[S]=0;
     /*while(ok)
     {
           ok=0;
           for(i=1;i<=N;i++)
                  for(q=G[i];q;q=q->next)
                        if(cap[i][q->x]-b[i][q->x]>0 && dist[i]+cost[i][q->x]<dist[q->x])
                        {
                              dist[q->x]=dist[i]+cost[i][q->x];
                              t[q->x]=i;
                              ok=1;
                        }
     }*/
     Q[p]=S; uz[S]=1;
     for(i=1;i<=p;i++)
     {
            for(q=G[Q[i]];q;q=q->next)
                  if(cap[Q[i]][q->x]-b[Q[i]][q->x]>0 && dist[Q[i]]+cost[Q[i]][q->x]<dist[q->x])
                        {
                              dist[q->x]=dist[Q[i]]+cost[Q[i]][q->x];
                              t[q->x]=Q[i];
                              if(!uz[q->x])
                              {
                                    Q[++p]=q->x;
                                    uz[q->x]=1;
                              }
                        }
            uz[Q[i]]=0;
     }

     if(dist[D]!=Inf)
            sw=1;

}

void imbun(int nod)
{
      if(nod!=S)
      {
            if(cap[t[nod]][nod]-b[t[nod]][nod]<min)
                  min=cap[t[nod]][nod]-b[t[nod]][nod];
            imbun(t[nod]);
            b[t[nod]][nod]+=min;
            b[nod][t[nod]]-=min;
            CT+=(long long)(cost[t[nod]][nod]*min);
      }
}

void solve()
{
      do{
            BF();
            min=Inf;
            if(sw)
                  imbun(D);

      }while(sw);
}

void write()
{
      printf("%lld\n",CT);
}

int main()
{
      freopen(infile,"r",stdin);
      freopen(outfile,"w",stdout);

      read();
      solve();
      write();

      fclose(stdin);
      fclose(stdout);
      return 0;
}