Cod sursa(job #555534)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 15 martie 2011 16:27:24
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include<fstream.h>
#include<vector.h>

using namespace std;

struct fl { int cost,flux,cap,ind;};

vector <fl> v[400];

int n,S,D,sol,Flux[400][400],Cap[400][400],Cost[400][400],sw[400],C[200000],dist[400],tata[400];

int getflux ()
{
	vector <fl> :: iterator it,it2;
	int inf,q,i,k,p,u,min1;
	inf=2000000000;
	
	memset(sw,0,sizeof(sw));
	C[1]=S;p=u=1;sw[S]=1;
	for (i=1;i<=n;i++)
		dist[i]=inf;
	dist[S]=0;
	
	while (p<=u)
	{
		it2=v[C[p]].end();
		for (it=v[C[p]].begin();it<it2;++it)
			if (dist[it->ind]>dist[C[p]]+it->cost && Flux[C[p]][it->ind]<Cap[C[p]][it->ind])
			{
				if (sw[it->ind]==0)
				{
					sw[it->ind]=1;
					C[++u]=it->ind;
				}
				dist[it->ind]=dist[C[p]]+it->cost;
				tata[it->ind]=C[p];
			}
		++p;sw[C[p-1]]=0;
	}
	
	min1=inf;
	for (k=D;k!=S;k=tata[k])
		if (min1>Cap[tata[k]][k]-Flux[tata[k]][k])
			min1=Cap[tata[k]][k]-Flux[tata[k]][k];
		
	for (k=D;k!=S;k=tata[k])
	{
		Flux[tata[k]][k]+=min1;
		Flux[k][tata[k]]-=min1;
	}
	
	sol+=min1*dist[D];
	
	return min1!=0;
}
	

void calculate ()
{
	int x;
	do
	{
		x=getflux();
	}
	while (x!=0);
}

void citire ()
{
	int i,x,y,z,c,m;
	fl nod;
	ifstream f("fmcm.in");
	f>>n>>m>>S>>D;
	for (i=1;i<=m;i++)
	{
		f>>x>>y>>c>>z;
		Cap[x][y]=c;
		Cost[x][y]=z; Cost[y][x]=-z;
		nod.ind=y;nod.cap=c;nod.cost=z; nod.flux=0;
		v[x].push_back(nod);
		nod.ind=x;nod.cap=0;nod.cost=-z;
		v[y].push_back(nod);
	}
	f.close();
}

void afisare ()
{
	ofstream g("fmcm.out");
	g<<sol<<'\n';
	g.close();
}

int main()
{
	citire();
	calculate();
	afisare();
	return 0;
}