Cod sursa(job #655656)

Utilizator lily3Moldovan Liliana lily3 Data 3 ianuarie 2012 11:07:25
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 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,min1;
int d[3600],cap[361][361],cost[361][361],fl[361][361],p[361];
bool b[361];
vector<int> a[361];
int q[1000010];
int bell()
{
	int i,x,st,dr;
	for(i=1;i<=n;++i)
		d[i]=inf,b[i]=0,p[i]=-1;
	d[s]=st=dr=0;
	b[s]=1;
	q[0]=s;
	//q.push(s);
	int ok=0;
	while(st<=dr)
	{
		x=q[st];
		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]];
					p[a[x][i]]=x;
				    if(!b[a[x][i]])
					{
							q[++dr]=a[x][i];
							b[a[x][i]]=1;
							
					}
				}
				b[x]=0;
				++st;
	}
    if(d[d1]!=inf)
	{
		 min1=inf;
		 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 d[d1]*min1;
	}
		return 0;	
}
int main()
{
	FILE*f=fopen("fmcm.in","r");
	fscanf(f,"%d%d%d%d",&n,&m,&s,&d1);
	for(i=1;i<=m;++i)
	{
		fscanf(f,"%d%d%d%d",&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;
	}
			r=1;
			while(r)
			{
				r=0;
				rez+=bell();
			}
				g<<rez<<"\n";
	return 0;
}