Cod sursa(job #291686)

Utilizator drag0shSandulescu Dragos drag0sh Data 30 martie 2009 10:28:01
Problema Flux maxim de cost minim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <stdio.h>
#include <vector>

using namespace std;

#define maxn 510
#define inf 2000000000
#define ll long long 
#define maxx 100010
#define NUME "fmcm"

FILE *in=fopen(NUME".in","r"),*out=fopen(NUME".out","w");

int n,m,s,d;
int drum,l;
vector <int> a[maxn];
int g[maxn],dist[maxn],from[maxn];
int q[maxn],u[maxn];
int c[maxn][maxn],f[maxn][maxn],cost[maxn][maxn];

int bellmanford(){
  int i,j,k;
  for(i=1;i<=n;i++){
    dist[i]=inf;
    from[i]=-1;
  }
  dist[s]=0;
  l=1;
  q[l]=s;
  memset(u,0,sizeof(u));
  u[s]=1;
  for(i=1;i<=l;i++){
    k=q[i];
    for(j=0;j<g[k];j++)
      if(c[k][a[k][j]]>f[k][a[k][j]]&&dist[k]+cost[k][a[k][j]]<dist[a[k][j]]){
	dist[a[k][j]]=dist[k]+cost[k][a[k][j]];
	from[a[k][j]]=k;
	if(u[a[k][j]]){
	    q[++l]=a[k][j];
	    u[q[l]]=1;
	}
	  
      }
    u[q[i]]=0;
  }
  if(dist[d]!=inf){
    int vmin=inf;
    drum=1;
    for(i=d;i!=s;i=from[i]) vmin=min(vmin,c[from[i]][i]-f[from[i]][i]);
    for(i=d;i!=s;i=from[i]){
      f[from[i]][i]+=vmin;
      f[i][from[i]]-=vmin;
    }
    return vmin*dist[d];
  }
  return 0;
}

void citire(){
  int i,x,y,z,cap;
  fscanf(in,"%d%d%d%d",&n,&m,&s,&d);
  for(i=1;i<=m;i++){
    fscanf(in,"%d%d%d%d",&x,&y,&cap,&z);
    a[x].push_back(y);
    a[y].push_back(x);
    c[x][y]=cap;
    cost[x][y]=z;
    cost[y][x]=-z;
  }
  for(i=1;i<=n;i++)g[i]=a[i].size();
}

ll flux(){
  ll rez=0;
  drum=1;
  while(drum){
    drum=0;
    rez+=bellmanford();
  }
  return rez;
}
int main(){
  citire();
  fprintf(out,"%lld",flux());
  fclose(in);
  fclose(out);
  return 0;
}