Cod sursa(job #411272)

Utilizator zbarniZajzon Barna zbarni Data 4 martie 2010 20:02:33
Problema Flux maxim de cost minim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<fstream>
#include<queue>
#include<cstdlib>
#include<vector>
#define nx 355
#define mx 800000
#define inf 2000000000
using namespace std;
int cap[nx][nx],flux[nx][nx],drum;
int n,m,tat[nx],cost[nx][nx],d[nx],Q[mx],S,D,viz[nx];
vector <int> a[nx];
inline int min (int x,int y)
{ if (x<y) return x; return y; }
long bf ()
{
	int i,r,j;
	for (i=1;i<=n;++i) { d[i]=inf; tat[i]=-1; viz[i]=0; }
	queue <int> Q;
	Q.push(S); d[S]=0;
	while (!Q.empty())
	{
		r=Q.front();
		viz[r]=0;
		for (i=0;i<a[r].size();++i)	
		if (cap[r][a[r][i]]>flux[r][a[r][i]] && d[a[r][i]]>d[r]+cost[r][a[r][i]])
			{
				d[a[r][i]]=d[r]+cost[r][a[r][i]];
				tat[a[r][i]]=r;
				if (!viz[a[r][i]])
				{
					viz[a[r][i]]=1;
					Q.push(a[r][i]);
				}
			}
		Q.pop();
	}
	if (d[D]!=inf)
	{
		r=inf;
		drum=1;
		for (i=D;i!=S;i=tat[i])
			r=min(r,cap[tat[i]][i]-flux[tat[i]][i]);
		for (i=D;i!=S;i=tat[i])
		{
			flux[tat[i]][i]+=r;
			flux[i][tat[i]]-=r;
		}
		return d[D]*r;
	}		
}

long fluxx ()
{
	long rez=0;drum=1;
	while (drum)
	{
		drum=0;
		rez+=bf();
	}
	return rez;
}
	
int main()
 {
  ifstream be ("fmcm.in");
  ofstream ki ("fmcm.out");
  be>>n>>m>>S>>D;
  int i,x,y,z,c;
  for (i=1;i<=m;++i)
   {
    be>>x>>y>>z>>c;
    cap[x][y]=z;
    cost[x][y]=c;
    cost[y][x]=-c;
	a[x].push_back(y);
	a[y].push_back(x);
   }
  be.close();
  ki<<fluxx()<<'\n';
  ki.close();
  return 0;
 }