Cod sursa(job #429007)

Utilizator Ionescu_MariaIonescu Maria-Dorina Ionescu_Maria Data 29 martie 2010 19:28:48
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<fstream.h>
#define infinit 32000
#define nmax 352
int n,m,a[nmax][nmax],b[nmax][nmax],cost[nmax][nmax],t[nmax],c[nmax],sw,s,f,min,d[nmax];
struct muchie
{int x,y,c;} e[25004];
void cit()
{//a[i][j] -  matricea costurilor, cu a[i][j]=0 daca nu exista (i,j)
	int i,j,k,c;
	ifstream fin("fmcm.in");
	fin>>n>>m;
	fin>>s>>f;
	for(k=1;k<=m;k++)
	{
		fin>>i>>j;
		fin>>a[i][j]>>c;
		e[k].x=i; e[k].y=j; e[k].c=c;
		e[k+m].x=j; e[k+m].y=i; e[k+m].c=-c;
	}
	fin.close();
}
int bellman(int s,int f)
{//Se cauta un drum in crestere cu cost minim folosind alg Bellman-Ford
	int i,j,k,l,sw,c;
	for(i=1;i<=n;i++)
			{t[i]=0;d[i]=infinit;}
	d[s]=0;
	sw=1;
	for(k=1;k<=n-1&&sw==1;k++)//cat timp s-a efectuat cel putin o minimizare
	{
		sw=0;
		for(l=1;l<=2*m;l++)
		{
			i=e[l].x;
			j=e[l].y;
			c=e[l].c;
			if(d[i]+c<d[j]&&a[i][j]-b[i][j]>0)
				{d[j]=d[i]+c;t[j]=i;sw=1;}
		}
	}
	k=f;
	while(k!=s&&k!=0)
		k=t[k];
	if(k==0)
		return 0;
	return 1;
}
void make_better(int nod)
{
	/*functie recursiva care imbunatateste drumul in crestere gasit 
	si memorat su ajutorul vectorului de tati t; min= capacitatea reziduala*/
	if(nod!=s)
		{
			if(a[t[nod]][nod]-b[t[nod]][nod]<min)
				min=a[t[nod]][nod]-b[t[nod]][nod];
			make_better(t[nod]);
			b[t[nod]][nod]+=min;
			b[nod][t[nod]]-=min;
		}
}
void afis()
{
	int i,rez=0;
	ofstream fout("fmcm.out");
	for(i=1;i<=m;i++)
		rez+=e[i].c*b[e[i].x][e[i].y];
	fout<<rez<<'\n';
	fout.close();
}
int main()
{
	cit();
	while(bellman(s,f))
	{
		min=infinit;
		make_better(f);
	}
	afis();
	return 0;
}