Cod sursa(job #428836)

Utilizator vladbBogolin Vlad vladb Data 29 martie 2010 16:46:20
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<fstream>
#include<vector>
#include<queue>

#define MAX 100000
#define maxn 510

using namespace std;

ifstream fin("fmcm.in");
ofstream fout("fmcm.out");

vector < pair<int,int> > v[maxn];
vector < pair<int,int> >::iterator it;
queue <int> q;
int n,m,S,T,flow,minim,drum;
int c[maxn][maxn],f[maxn][maxn],d[maxn],t[maxn],pus[maxn];

int bellmanford()
{	int i,nod;
	for(i=1;i<=n;i++)
	{	d[i]=MAX;
		t[i]=-1;
		pus[i]=0;
	}
	d[S]=0;
	q.push(S);
	pus[S]=1;
	while(!q.empty())
	{	nod=q.front();
		for(it=v[nod].begin();it!=v[nod].end();it++)
			if(d[it->first]>d[nod]+it->second&&c[nod][it->first]-f[nod][it->first]>0)
			{	d[it->first]=d[nod]+it->second;
				t[it->first]=nod;
				if(pus[it->first]==0)
				{	q.push(it->first);
					pus[it->first]=1;
				}
			}
		pus[nod]=0;
		q.pop();
	}
	if(d[T]!=MAX)
	{	minim=MAX;
		drum=1;
		i=T;
		while(i!=S)
		{	minim=min(minim,c[t[i]][i]-f[t[i]][i]);
			i=t[i];
		}
		i=T;
		while(i!=S)
		{	f[t[i]][i]+=minim;
			f[i][t[i]]-=minim;
			i=t[i];
		}
		return minim*d[T];
	}
	return 0;
}

void flux()
{	drum=1;
	while(drum)
	{	drum=0;
		flow+=bellmanford();
	}
}

int main()
{	int i,x,y,z,cc;
	fin>>n>>m>>S>>T;
	for(i=1;i<=m;i++)
	{	fin>>x>>y>>cc>>z;
		c[x][y]=cc;
		v[x].push_back(make_pair(y,z));
		v[y].push_back(make_pair(x,-z));
	}
	flux();
	fout<<flow;
	fin.close();
	fout.close();
	return 0;
}