Cod sursa(job #244824)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 16 ianuarie 2009 00:51:35
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include<stdio.h>
#define N 360
#define i8 2000000000
struct nod{int inf;nod *urm;};
struct nodc{int vvv,ccc;nodc *next;};
nod *p[N];
nodc *prim,*ultim;
int n,m,s,d,nc,nv,cc,cv,fd,fm,
cap[N][N],cost[N][N],flow[N][N],dad[N],c[N];
long long sol,lf,lc;
void readd(),flux(),enque(int V,int C),deque();
int main()
{
	readd();
	flux();
	return 0;
}
void readd()
{       int i,xx,yy,cp,vv;nod *paux;
	freopen("fmcm.in","r",stdin);
	freopen("fmcm.out","w",stdout);
	scanf("%d%d%d%d",&n,&m,&s,&d);
	for(i=1;i<=m;i++)
	{ scanf("%d%d%d%d",&xx,&yy,&cp,&vv);
	  paux=new nod;paux->inf=xx;paux->urm=p[yy];p[yy]=paux;
	  paux=new nod;paux->inf=yy;paux->urm=p[xx];p[xx]=paux;
	  cap[xx][yy]=cp;cost[xx][yy]=vv;cost[yy][xx]=-vv;
	}
	prim=new nodc;prim->next=0;ultim=prim;
}
void flux()
{     nod *paux;
      for(;;)
      { for(nc=1;nc<=n;nc++){c[nc]=i8;dad[nc]=0;}c[s]=0;enque(s,0);
	while(prim->next)
	{ nc=prim->next->vvv;cc=prim->next->ccc;
	  if(cc<=c[nc])
	   for(paux=p[nc];paux;paux=paux->urm)
	   { nv=paux->inf;
	     if(cap[nc][nv]-flow[nc][nv])
	     { cv=cc+cost[nc][nv];
	       if(cv<c[nv])
	       { c[nv]=cv;dad[nv]=nc;enque(nv,cv);}
	     }
	   }
          deque();
	}
	if(c[d]==i8){printf("%lld",sol);return;}
	fd=i8;
	for(nc=d;dad[nc];nc=dad[nc])
	{ fm=cap[dad[nc]][nc]-flow[dad[nc]][nc];
	  fd=(fd<fm)?fd:fm;
	}
	sol+=c[d]*fd;
	for(nc=d;dad[nc];nc=dad[nc])
	{ flow[dad[nc]][nc]+=fd;flow[nc][dad[nc]]-=fd;}
      }
}
void enque(int V,int C)
{
	nodc *paux;
	paux=new nodc;paux->vvv=V;paux->ccc=C;paux->next=0;
	ultim->next=paux;ultim=paux;
}
void deque()
{
	nodc *paux;
	paux=prim;prim=prim->next;delete paux;
}