Cod sursa(job #567856)

Utilizator irene_mFMI Irina Iancu irene_m Data 30 martie 2011 15:45:19
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.76 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 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 BF()
{
      int i,p=1;
      edge *q;
      for(i=1;i<=N;i++)
            dist[i]=Inf, t[i]=-1;
     sw=0;
     dist[S]=0;

     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 solve()
{
      int nod;
      do{
            BF();
            if(sw)
            {
                  min=Inf;
                  nod=D;
                  while(nod!=S)
                  {
                        if(cap[t[nod]][nod]-b[t[nod]][nod]<min)
                              min=cap[t[nod]][nod]-b[t[nod]][nod];
                        nod=t[nod];
                  }
                  nod=D;
                  while(nod!=S)
                  {
                        b[t[nod]][nod]+=min;
                        b[nod][t[nod]]-=min;
                        CT+=(long long)(cost[t[nod]][nod]*min);
                        nod=t[nod];
                  }
            }

      }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;
}