Cod sursa(job #253152)

Utilizator yoyolichIoana Ardeleanu yoyolich Data 5 februarie 2009 14:54:37
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<stdio.h>
#include<vector>
#define nmax 351
#define oo 0x3f3f3f3f
using namespace std;

FILE *f=fopen("fmcm.in","r"), *g=fopen("fmcm.out","w");

vector<int> G[nmax];
int n,m,x,y,c,z,cap[nmax][nmax],cost[nmax][nmax],flux[nmax][nmax],viz[nmax],tata[nmax],Q[1000010];
int ok,S,D,dist[nmax],fmin;



void citire()
{
	int i;
	fscanf(f,"%d %d %d %d",&n,&m,&S,&D);
	for(i=1;i<=m;i++)
	{
		fscanf(f,"%d %d %d %d",&x,&y,&c,&z);
		
		G[x].push_back(y);
		G[y].push_back(x);
		
		cap[x][y]=c;
		cost[x][y]=z;
		cost[y][x]=-z;
	}
	fclose(f);
}

inline int bellman_ford()
{
	int prim, ultim,i,fmin;
	prim=ultim=1;
	memset(viz,0, sizeof(viz));
	memset(dist,oo,sizeof(dist));
	memset(tata,-1,sizeof(tata));
	Q[prim]=S;
	dist[S]=0;
	viz[S]=1;
	while(prim<=ultim)
	{
		x=Q[prim++];
		for(i=0;i<G[x].size();i++)
		{
			if(cap[x][G[x][i]]-flux[x][G[x][i]]>0 && dist[x]+cost[x][G[x][i]]<dist[G[x][i]])
			{
				dist[G[x][i]]=dist[x]+cost[x][G[x][i]];
				tata[G[x][i]]=x;
				if(!viz[G[x][i]])
				{
					viz[G[x][i]]=1;
					Q[++ultim]=G[x][i];
					
				}
			}
		}
		viz[x]=0;
	}
	
	if(dist[D]!=oo)
	{
		fmin=oo;
		ok=1;
		for(i=D;i!=S;i=tata[i])
		{
			fmin=min(fmin,cap[tata[i]][i]-flux[tata[i]][i]);
		}
		
		for(i=D;i!=S; i=tata[i])
		{
			flux[tata[i]][i]+=fmin;
			flux[i][tata[i]]-=fmin;
		}
		return fmin*dist[D];
	}
	return 0;
}
	
long long  flow()
{
	long long rez=0;
	ok=1;
	
	while(ok)
	{
		ok=0;
		rez+=bellman_ford();
	}
	
	return rez;
}
	
int main()
{
	citire();
	fprintf(g,"%lld\n",flow());
	fclose(g);
	fclose(f);
	return 0;
}