Cod sursa(job #669544)

Utilizator lily3Moldovan Liliana lily3 Data 27 ianuarie 2012 11:45:04
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include<fstream>
#include<vector>
#include<queue>
#define inf 10000001
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[3600],cap[361][361],cost[361][361],fl[361][361],p[361];
bool b[361],uz[361];
vector<int> a[361];
queue<int> q;
inline void bell()
{
	int i,x,j,k,ok=0;
	for(i=1;i<=n&&!ok;++i)
		for(j=1;j<=n;++j)
			for(k=0;k<a[j].size();++j)
				if(cap[j][a[j][k]]-fl[j][a[j][k]]>0&&d[a[j][k]]>d[j]+cost[j][a[j][k]])
				{
					d[a[j][k]]=d[j]+cost[j][a[j][k]];
					ok=1;
				}
	/*for(i=1;i<=n;++i)
		d[i]=inf,b[i]=0,p[i]=-1;
	d[s]=0;
	b[s]=1;
	q.push(s);
	int ok=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]]>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;
					}
				}
				b[x]=0;
				q.pop();
	}*/
	sum=d[d1];
}
inline 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,uz[i]=0;
	q.push(s);
	d[s]=0;
	uz[s]=1;
	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];
		r=1;
		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();
			r=1;
			while(r)
			{
				r=0;
				rez+=dijkstra();
			}
				g<<rez<<"\n";
	return 0;
}