Cod sursa(job #244380)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 14 ianuarie 2009 22:29:14
Problema Flux maxim de cost minim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.51 kb
#include<stdio.h>
#define N 360
struct nod{int inf;nod *urm;};
nod *p[N],*paux;
int n,m,s,d,i,xx,yy,cc,vv,ok,j,lheap,nc,nv,dc,dv,fd,cd,fm,fs,aux,
i8=2000000000,
cap[N][N],cost[N][N],flow[N][N],dad[N],heap[N],poz[N],val[N];
long long sol,lf,lc;
void readd(),bellman_ford(),flux(),djikstra();
int main()
{
	readd();
	bellman_ford();
	flux();
	return 0;
}
void readd()
{
	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,&cc,&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]=cc;cost[xx][yy]=vv;cost[yy][xx]=-vv;
	}
}
void bellman_ford()
{
	for(i=1;i<=n;i++){val[i]=i8;dad[i]=0;}val[s]=0;
	ok=1;
	while(ok)
	{       ok=0;
		for(i=1;i<=n;i++)
		{ if(val[i]==i8)continue;
		  for(paux=p[i];paux;paux=paux->urm)
		   {  j=paux->inf;
		      if(cap[i][j]-flow[i][j])
		       if(val[j]>val[i]+cost[i][j])
		       { val[j]=val[i]+cost[i][j];
			 dad[j]=i;ok=1;
		       }
		   }
		}
	}
	lc=val[d];
}
void flux()
{
	djikstra();
	printf("%lld\n",sol);
}
void djikstra()
{     for(;;)
      { for(i=1;i<=n;i++)
	 for(paux=p[i];paux;paux=paux->urm)
	  if(val[i]<i8&&val[paux->inf]<i8)
	    cost[i][paux->inf]+=val[i]-val[paux->inf];
	for(i=1;i<=n;i++) { val[i]=i8;heap[i]=i;poz[i]=i;dad[i]=0;}
	val[s]=0;lheap=n;heap[1]=s;heap[s]=1;poz[s]=1;poz[1]=s;
	while(lheap>1&&val[heap[1]]<i8)
	{  for(paux=p[heap[1]];paux;paux=paux->urm)
	    if(cap[heap[1]][paux->inf]-flow[heap[1]][paux->inf]>0)
	     if(val[heap[1]]+cost[heap[1]][paux->inf]<val[paux->inf])
	      { val[paux->inf]=val[heap[1]]+cost[heap[1]][paux->inf];
		dad[paux->inf]=heap[1];
		for(j=poz[paux->inf];;)
		 { if(j==1||val[heap[j]]>=val[heap[j>>1]])break;
		   aux=heap[j];heap[j]=heap[j>>1];heap[j>>1]=aux;
		   poz[heap[j]]=j;poz[heap[j>>1]]=j>>1;
		 }
	       }
	   heap[1]=heap[lheap];poz[heap[1]]=1;lheap--;
	   if(lheap)
	   for(j=1;;)
	     { fs=j<<1;fd=fs+1;
	       if(fs>lheap)break;
	       if(fs<lheap)fs=(val[heap[fs]]<=val[heap[fd]])?fs:fd;
	       if(val[heap[j]]<=val[heap[fs]])break;
	       aux=heap[j];heap[j]=heap[fs];heap[fs]=aux;
	       poz[heap[j]]=j;poz[heap[fs]]=fs;j=fs;
	     }
	}
	if(val[d]==i8)return;
	fd=i8;
	for(i=d;dad[i];i=dad[i])
	fd=(cap[dad[i]][i]-flow[dad[i]][i]<fd)?cap[dad[i]][i]-flow[dad[i]][i]:fd;
	lc+=val[d];
	sol+=lc*fd;
	for(i=d;dad[i];i=dad[i]){flow[dad[i]][i]+=fd;flow[i][dad[i]]-=fd;}
      }
}