Cod sursa(job #566493)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 29 martie 2011 09:11:13
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
#define Nmax 351
#define inf 0x3f3f3f3f

using namespace std;

int N,M,S,D,fm[Nmax][Nmax],cp[Nmax][Nmax],cost[Nmax][Nmax],v[Nmax],t[Nmax],inQ[Nmax],sol;

vector <int> a[Nmax];
queue <int> q;


int bf(){
	
	memset(inQ,0,sizeof(inQ));
	memset(v,inf,sizeof(v));

	
	v[S]=0;
	q.push(S);
	
	while(!q.empty()) {
		
		int nod = q.front();
		q.pop();
		inQ[nod]=0;
		
		for(vector<int>::iterator it= a[nod].begin();it!=a[nod].end();++it){
			
			if( v[*it] > v[nod] + cost [nod] [*it] && cp[nod][*it] > fm[nod][*it]){
				v[*it] = v[nod] + cost [nod] [*it];
				t[*it] = nod;
				
				if(!inQ[*it] && *it!=D){
					inQ[*it]=1;
					q.push(*it);}				
			}
			
		}
	}
	
	if(v[D]!=inf)
		return 1;
	return 0;	
}
int main(){
		
	freopen("fmcm.in","r",stdin);
	freopen("fmcm.out","w",stdout);
	
	scanf("%d%d%d%d",&N,&M,&S,&D);
	
	for(int i=1;i<=M;++i){
		
		int x,y,c,z;
		scanf("%d%d%d%d",&x,&y,&c,&z);
		
		a[x].push_back(y);
		a[y].push_back(x);
		
		cp[x][y]=c;
		cost[x][y]=z;
		cost[y][x]=-z;
	}
	
	while(bf()){
		
		int fmn=inf;
		
		for(int nod=D;nod!=S;nod=t[nod])
			fmn=min(fmn,cp[t[nod]][nod]-fm[t[nod]][nod]);
		for(int nod=D;nod!=S;nod=t[nod]){
			fm[t[nod]][nod]+=fmn;
			fm[nod][t[nod]]-=fmn;
		}
		
		sol+=fmn*v[D];
	}
	
	printf("%d\n",sol);
	
return 0;
}