Cod sursa(job #301709)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 8 aprilie 2009 13:19:43
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include<stdio.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
FILE*fin=fopen("fmcm.in","r");
FILE*fout=fopen("fmcm.out","w");
#define inf 1000000000
#define nm 500
#define min(a,b)((a)<(b)?(a):(b))
#define pb push_back
int n,m,s,d,dmin[nm],t[nm],cap[nm][nm],flow[nm][nm],cost[nm][nm];
char inside[nm];
long long ans=0;
vector<int> g[nm];
queue<int> q; 
int is_drum()
{
  int i,nod,nnod,fl_crt;  
  for(i=1;i<=n;i++)
  {
    inside[i]=0;
    dmin[i]=inf;
  }  
  inside[s]=1;
  dmin[s]=0;
   q.push(s);
  while(!q.empty())
  {
    nod=q.front();
    q.pop();
    for(i=0;i<g[nod].size();i++)
    {
      nnod=g[nod][i];
      if(cap[nod][nnod]-flow[nod][nnod]) 
      if(dmin[nnod]>dmin[nod]+cost[nod][nnod])
      {
        dmin[nnod]=dmin[nod]+cost[nod][nnod];
        t[nnod]=nod;
        if(!inside[nnod])
        {
          q.push(nnod);
          inside[nnod]=1;
        }                                   
      } 
    }
  }  
  if(dmin[d]==inf) return 0;
  fl_crt=inf;
  nod=d;
  while(nod!=s)
  {
    fl_crt=min(fl_crt,cap[t[nod]][nod]-flow[t[nod]][nod]);           
    nod=t[nod];
  }
  ans+=(long long)fl_crt*(long long)(dmin[d]);
  nod=d;
  while(nod!=s)
  {
    flow[t[nod]][nod]+=fl_crt;
    flow[nod][t[nod]]-=fl_crt;
    nod=t[nod];
  }
  return 1;
}
int main()
{
  int a,b,capac,c,i;  
  memset(cap,0,sizeof(cap));
  memset(flow,0,sizeof(flow));
  fscanf(fin,"%d%d%d%d",&n,&m,&s,&d);
  for(i=1;i<=m;i++)
  {
    fscanf(fin,"%d%d%d%d",&a,&b,&capac,&c);
    g[a].pb(b);
    g[b].pb(a);
    cap[a][b]=capac;
    cost[a][b]=c;
    cost[b][a]=-c;
  }  
  while(is_drum());
  fprintf(fout,"%lld",ans); 
  fclose(fin);
  fclose(fout);
  return 0;
}