Cod sursa(job #563191)

Utilizator Ionescu_MariaIonescu Maria-Dorina Ionescu_Maria Data 24 martie 2011 18:13:28
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<fstream.h>
#define nmax 352
#define inf 32000
int n,m,a[nmax][nmax],b[nmax][nmax],t[nmax],d[nmax],s,f,min;
struct muchie
{int x,y,c;} e[25004];
void cit()
{
	int i,j,k,co;
	ifstream fin("fmcm.in");
	fin>>n>>m;
	fin>>s>>f;
	for(k=1;k<=m;k++)
	{
		fin>>i>>j;
		fin>>a[i][j]>>co;
		e[k].x=i; e[k].y=j; e[k].c=co;
		e[k+m].x=j; e[k+m].y=i; e[k+m].c=-co;
	}
	fin.close();
}
int bellman(int s,int f)
{
	int i,j,k,l,sw,c;
	for(k=1;k<=n;k++)
	{
		t[k]=0;
		d[k]=inf;
	}
	d[s]=0; sw=1;
	for(k=1;k<=n-1&&sw;k++)
	{
		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)
{
	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 rez=0;
	for(int i=1;i<=i;i++)
		rez+=e[i].c*b[e[i].x][e[i].y];
	ofstream fout("fmcm.out");
	fout<<rez<<'\n';
	fout.close();
}
int main()
{
	cit();
	while(bellman(s,f))
	{
		min=inf;
		make_better(f);
	}
	afis();
	return 0;
}