Cod sursa(job #1157107)

Utilizator Kira96Denis Mita Kira96 Data 28 martie 2014 11:33:32
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<fstream>
#include<algorithm>
#include<cstring>
#define fi first
#define se second
#include<queue>
#define INF 0x3f3f3f3f
#include<vector>
#define N 400
#define FOR(a,b,c) for(int a=b;a<=c;a++)
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
queue<short int> Q;
vector<pair<short int,short int> > v[N];
pair<short int,short int> des;
short int Cp[N][N],T[N],F[N][N];
bool inQ[N];
int qsize,i,n,m,minim,cost,nod,S,D,c,z,x,y,C[N];
inline void read()
{
	f>>n>>m>>S>>D;
	FOR(i,1,m)
	{
		f>>x>>y>>c>>z;
		Cp[x][y]=c;
		v[x].push_back(make_pair(y,z));
		v[y].push_back(make_pair(x,-z));
	}
}
inline void init()
{
	memset(inQ,0,sizeof(inQ));
	memset(C,INF,sizeof(C));
	qsize=1; Q.push(S); inQ[S]=1;
	C[S]=0; minim=INF;
}
inline bool fmcm()
{
	init();
	while(qsize)
	{
		nod=Q.front();
		Q.pop();
		qsize--;
		inQ[nod]=0;
		FOR(i,0,v[nod].size()-1)
		{
			des=v[nod][i];
			if(Cp[nod][des.fi]>F[nod][des.fi]&&C[des.fi]>C[nod]+des.se)
			{
				C[des.fi]=C[nod]+des.se;
				T[des.fi]=nod;
				if(!inQ[des.fi])
				{
					inQ[des.fi]=1;
					Q.push(des.fi);
					++qsize;
				}
			}
		}
	}
		if(C[D]!=INF)
		{
			for(nod=D;T[nod];nod=T[nod])
			minim=min(minim,Cp[T[nod]][nod]-F[T[nod]][nod]);
			for(nod=D;T[nod];nod=T[nod])
			{
				F[T[nod]][nod]+=minim;
				F[nod][T[nod]]-=minim;
			}
		}
	return (C[D]!=INF);
}
inline void solve()
{
	while(fmcm())
		cost+=minim*C[D];
	g<<cost;
}
int main ()
{
	read();
	solve();
	return 0;
}