Cod sursa(job #655589)

Utilizator lily3Moldovan Liliana lily3 Data 2 ianuarie 2012 23:06:49
Problema Flux maxim de cost minim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include<fstream>
#include<vector>
#include<queue>
#define inf 100000001
using namespace std;
ofstream g("fmcm.out");

int i,j,n,m,s,d1,xx,yy,cp,c1,r,rez=0,sum=0;
int d[361],cap[361][361],cost[361][361],fl[361][361];
vector<int> a[361];
queue<int> q;
void bell(int x)
{
	int i,b[361],c[361];
	for(i=2;i<=n;++i)
		d[i]=inf,b[i]=0,c[i]=0;
	d[s]=0;
	q.push(s);
	int ok=0;
	while(!q.empty())
	{
		x=q.front();
		b[x]=0;
		for(i=0;i<a[x].size();++i)
			if(d[x]<inf)
				if(cap[x][a[x][i]]-fl[x][a[x][i]]>0&&d[a[x][i]]>d[x]+cost[x][a[x][i]])
				{
					d[a[x][i]]=d[x]+cost[x][a[x][i]];
					if(!b[a[x][i]])
					{
							q.push(a[x][i]);
							b[a[x][i]]=1;
					}
				}
				q.pop();
	}
	sum=d[d1];
}
int dijkstra()
{
	int i,x,min1,p[361],j;
	for(i=1;i<=n;++i)
		for(j=0;j<a[i].size();++j)
			if(d[i]!=inf&&d[a[i][j]]!=inf)
				cost[i][a[i][j]]+=d[i]-d[a[i][j]];
	for(i=1;i<=n;++i)
				d[i]=inf,p[i]=-1;
	q.push(s);
	d[s]=0;
	while(!q.empty())
	{
		x=q.front();
		for(i=0;i<a[x].size();++i)
			if(cap[x][a[x][i]]>fl[x][a[x][i]]&&d[a[x][i]]>d[x]+cost[x][a[x][i]])
			{
				d[a[x][i]]=d[x]+cost[x][a[x][i]],q.push(a[x][i]);
				p[a[x][i]]=x;
			}
			q.pop();
	}
	min1=inf;
	if(d[d1]!=inf)
	{
		sum+=d[d1];
		for(i=d1;i!=s;i=p[i])
		{
			if(min1>cap[p[i]][i]-fl[p[i]][i])
				min1=cap[p[i]][i]-fl[p[i]][i];
		}
			for(i=d1;i!=s;i=p[i])
			{
				fl[p[i]][i]+=min1;
				fl[i][p[i]]-=min1;
			}
			return sum*min1;
	}
		return 0;		
}
int main()
{
	ifstream f("fmcm.in");
	f>>n>>m>>s>>d1;
	for(i=1;i<=m;++i)
	{
		f>>xx>>yy>>cp>>c1;
		a[xx].push_back(yy);
		a[yy].push_back(xx);
		cost[xx][yy]=c1;
		cost[yy][xx]=-c1;
		cap[xx][yy]=cp;
	}
	bell(s);
			r=1;
			while(r)
			{
				r=dijkstra();
				rez+=r;
			}
				g<<rez<<"\n";
	return 0;
}