Cod sursa(job #597949)

Utilizator crushackPopescu Silviu crushack Data 24 iunie 2011 01:16:50
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#include <algorithm>
#define NMax 400
#define INF 0x3f3f3f3f
using namespace std;

const char IN[]="fmcm.in",OUT[]="fmcm.out";

int N,M,S,D;
int C[NMax][NMax] , F[NMax][NMax] , Cost[NMax][NMax] , T[NMax] , P[NMax];
bool visit[NMax];
vector<int> ad[NMax];

struct cmp{
	bool operator()(int a,int b) const{
		return T[a]>T[b];
	}
};

priority_queue< int , vector<int> , cmp > qu;

int Dijkstra()
{
	int x;
	
	qu.push(S);
	memset(visit,0,sizeof(visit));
	memset(T,0x3f,sizeof(T));
	
	T[S]=0;
	while (!qu.empty())
	{
		x=qu.top();qu.pop();visit[x]=false;
		
		for (vector<int>::iterator it=ad[x].begin();it<ad[x].end();++it)
			if (C[x][*it]>F[x][*it] && T[x]+Cost[x][*it]<T[*it])
			{
				T[*it]=T[x]+Cost[x][*it];P[*it]=x;
				if (!visit[*it])
					qu.push(*it),visit[*it]=true;
			}
	}
	
	return T[D]!=INF;
}

int flux()
{
	int ret=0,i;
	
	while (Dijkstra())
	{
		int Fmin=INF;
		
		for (i=D;i!=S;i=P[i])
			Fmin=min(Fmin,C[P[i]][i]-F[P[i]][i]);
		
		for (i=D;i!=S;i=P[i])
			F[P[i]][i]+=Fmin,
			F[i][P[i]]-=Fmin;
			
		ret+= Fmin*T[D];
	}
	return ret;
}

int main()
{
	int x,y,c,z;
	freopen(IN,"r",stdin);
	scanf("%d%d%d%d",&N,&M,&S,&D);
	while (M--)
	{
		scanf("%d%d%d%d",&x,&y,&c,&z);
		ad[x].push_back(y);
		ad[y].push_back(x);
		Cost[x][y]=z;
		Cost[y][x]=-z;
		C[x][y]=c;//C[y][x]=c;
	}
	fclose(stdin);
	
	freopen(OUT,"w",stdout);
	printf("%d\n",flux());
	fclose(stdout);
	
	return 0;
}