Cod sursa(job #1094058)

Utilizator anaid96Nasue Diana anaid96 Data 28 ianuarie 2014 21:10:11
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include<stdio.h>
#include<queue>
#include<vector>
#include<cstring>
#include<algorithm>

using namespace std;

FILE *in,*out;

//definitii
#define pb push_back

//functii
bool bellman(int *destDist);

//constante
const int Nmax=351;
const int oo=0x3f3f3f3f;

//variabile
int noduri,muchii,sursa,dest;
int nod1,nod2,cap,rcost;
vector<int> graf[Nmax];
int emptySpace[Nmax][Nmax],cost[Nmax][Nmax];
bool inQueue[Nmax];
int tata[Nmax],dist[Nmax];
int minflow,node,maxflow;


int main(void)
{
	in=fopen("fmcm.in","rt");
	out=fopen("fmcm.out","wt");
	fscanf(in,"%d%d%d%d",&noduri,&muchii,&sursa,&dest);
	
	while(muchii--)
	{
		fscanf(in,"%d%d%d%d",&nod1,&nod2,&cap,&rcost);
		graf[nod1].pb(nod2);
		graf[nod2].pb(nod1);
		
		emptySpace[nod1][nod2]=cap;
		
		cost[nod1][nod2]=rcost;
		cost[nod2][nod1]=-rcost;
	}	
	
	int dist;
	
	while(bellman(&dist))
	{
		int minflow=oo;
		
		for(node=dest ; node!=sursa ; node=tata[node])
			minflow=min(minflow,emptySpace[tata[node]][node]);
		
		for(node=dest ; node!=sursa ; node=tata[node])
		{
			emptySpace[tata[node]][node]-=minflow;
			emptySpace[node][tata[node]]+=minflow;
		}	
		
		maxflow+=dist*minflow;
		
	}	
	fprintf(out,"%d",maxflow);
	fclose(in);
	fclose(out);
	return 0;
	
}	

bool bellman(int *destDist)
{
	memset(dist,oo,sizeof(dist));
	memset(tata,0,sizeof(tata));
	memset(inQueue,false,sizeof(inQueue));
	
	dist[sursa]=0;
	tata[sursa]=-1;
	
	queue<int> q;
	q.push(sursa);
	inQueue[sursa]=true;
	while(!q.empty())
	{
		int curent=q.front();
		q.pop();
		inQueue[curent]=false;
		
		vector<int> :: iterator it,end=graf[curent].end();
		for(it=graf[curent].begin() ; it!=end ; ++it)
		{
			if(!emptySpace[curent][*it])
				continue;
			
			if(dist[*it] <= dist[curent]+cost[curent][*it])
				continue;
			
			tata[*it]=curent;
			dist[*it]=dist[curent]+cost[curent][*it];
			if(!inQueue[*it])
			{
				q.push(*it);
				inQueue[*it]=true;
			}
		}
	}
	*destDist=dist[dest];
	if(tata[dest])
		return true;
	return false;
}