Cod sursa(job #302963)

Utilizator zbarniZajzon Barna zbarni Data 9 aprilie 2009 14:00:55
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include<fstream.h>
#define min(x,y) ((x)<(y)?(x):(y))
#include<string.h>
#define nx 355
#define mx 1000005
#define inf 2000000000
struct graf
 {
  int nod;
  graf *next;
 };
graf *a[nx];
int Q[mx],cost[nx][nx],flux[nx][nx],d[nx],n,m,inQ[nx],drum,cap[nx][nx];
int tat[nx],S,D;
long bf()
 {
  int e,v,r,nr,i;
  for (i=1;i<=n;++i)
   {
    d[i]=inf;inQ[i]=0;tat[i]=-1;
   }
  d[S]=0;
  e=v=1;
  nr=1;
  Q[1]=S;
  while (e<=v)
   {
    r=Q[e++];
//    e=(e+1)%n;
    inQ[r]=0;
//    nr--;
    for (graf *q=a[r];q;q=q->next)
      if (cap[r][q->nod]>flux[r][q->nod] && d[q->nod]>d[r]+cost[r][q->nod])
	{
	 d[q->nod]=d[r]+cost[r][q->nod];
	 tat[q->nod]=r;
	 if (!inQ[q->nod])
	  {
	   //v=(v+1)%n;
	   Q[++v]=q->nod;
	   inQ[q->nod]=1;
//	   ++nr;
	  }
	}
   }
  if (d[D]!=inf) {
  drum=1;
  r=inf;
  for (i=D;i!=S;i=tat[i])
    r=min(r,cap[tat[i]][i]-flux[tat[i]][i]);
  for (i=D;i!=S;i=tat[i])
    {
     flux[tat[i]][i]+=r;
     flux[i][tat[i]]-=r;
    }
  return d[D]*r;
  }
  return 0;
 }


long Flux()
 {
  long rez=0;
  drum=1;
  while (drum)
   {
    drum=0;
    rez+=bf();
   }
  return rez;
 }

int main()
 {
  ifstream be ("fmcm.in");
  ofstream ki ("fmcm.out");
  be>>n>>m>>S>>D;
  int i,x,y,c,p;
  for (i=1;i<=m;++i)
   {
    be>>x>>y>>p>>c;
    graf *q=new graf;
    q->nod=y;
    q->next=a[x];
    a[x]=q;
    q=new graf;
    q->nod=x;
    q->next=a[y];
    a[y]=q;
    cost[x][y]=c;
    cost[y][x]=-c;
    cap[x][y]=p;
   }
  be.close();
  ki<<Flux()<<'\n';
  ki.close();
  return 0;
 }