Cod sursa(job #302972)

Utilizator zbarniZajzon Barna zbarni Data 9 aprilie 2009 14:07:16
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include<fstream.h>
#include<string.h>
#include<stdlib.h>
#define nx 355
#define mx 1000000
#define inf 2000000000
struct graf
 {
  int nod;
  graf *next;
 };
graf *a[nx];
int cap[nx][nx],flux[nx][nx],drum;
int n,m,tat[nx],cost[nx][nx],d[nx],Q[mx],S,D,inQ[nx];
inline int min(int a,int b)
 {
  if (a<b) return a;
  return b;
 }


int bf ()
 {
  int i,w,r,st,dr;
  for (i=1;i<=n;++i)
   {d[i]=inf;
   tat[i]=-1;
   inQ[i]=0;}
  Q[1]=S;d[S]=0;inQ[S]=1;
  st=dr=1;
  while (st<=dr)
   {
    r=Q[st++];
    inQ[r]=0;
    /*for (i=1;i<=a[r][0];++i)
      if (cap[r][a[r][i]]>flux[r][a[r][i]] && d[a[r][i]]>d[r]+cost[r][a[r][i]])
       {
	d[a[r][i]]=d[r]+cost[r][a[r][i]];
	tat[a[r][i]]=r;
	if (!inQ[a[r][i]])
	 {
	  inQ[a[r][i]]=1;
	  Q[++dr]=a[r][i];
	 }
       }*/
    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])
	  {
	   Q[++dr]=q->nod;
	   inQ[q->nod]=1;
	  }
	}
   }
  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 fluxx()
 {
  long rez=0;drum=1;
  while (drum)
   {
    drum=0;
    rez+=bf();
   }
  return rez;
 }

int main()
 {
  ifstream be ("maxflow.in");
  ofstream ki ("maxflow.out");
  be>>n>>m>>S>>D;
  int i,x,y,z,c;
 /* for (i=1;i<=n;++i)
   {
    a[i]=(int*)realloc(a[i],sizeof(int));
    a[i][0]=0;
   }*/
  for (i=1;i<=m;++i)
   {
    be>>x>>y>>z>>c;
/*    cap[x][y]=z;
    cost[x][y]=c;
    cost[y][x]=-c;
    a[x][0]++;
    a[x][a[x][0]]=y;
    a[y][0]++;
    a[y][a[y][0]]=x;*/
    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]=z;
   }
  be.close();
  ki<<fluxx()<<'\n';
  ki.close();
  return 0;
 }