Cod sursa(job #1534992)

Utilizator spatarelDan-Constantin Spatarel spatarel Data 24 noiembrie 2015 10:20:40
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>

using namespace std;

const int MAXN=350,INF=2000000000;

FILE* f = fopen("fmcm.in","r");
FILE* h = fopen("fmcm.out","w");

int N, M;

vector<int> graf[1 + MAXN];

int S, D;

int capacitate[1 + MAXN][1 + MAXN];
int cost[1+MAXN][1+MAXN];
int flux[1 + MAXN][1 + MAXN];

struct Nod {
  int index, cost;

  const bool operator < (const Nod &b) const {
    return this->cost < b.cost;
  }
};

queue<Nod> q;
int fost[1 + MAXN];
int distanta[1 + MAXN];

int fluxtotal,costtotal;

bool bellmanFord(){
  memset(fost,0,sizeof(fost));
  memset(distanta,0x3f,sizeof(distanta));
  q.push(Nod({S, 0}));
  fost[S]=S;
  distanta[S]=0;
  while ( !q.empty() ){
    int nod=q.front().index;
    int costcurent=q.front().cost;
    q.pop();
    if (distanta[nod] == costcurent) {
      for ( int i=0;i<(int)graf[nod].size();++i ){
        int vecin=graf[nod][i];
        if (costcurent+cost[nod][vecin] < distanta[vecin]&&capacitate[nod][vecin]-flux[nod][vecin] > 0){
          q.push(Nod{vecin,(costcurent+cost[nod][vecin])});
          distanta[vecin] = costcurent+cost[nod][vecin];
          fost[vecin] = nod;
        }
      }
    }
  }
  return fost[D] > 0;
}

int main(void) {
  int i;
  fscanf(f,"%d%d%d%d", &N, &M, &S, &D);
  for (i = 0; i < M; ++i) {
    int x, y, fl, co;
    fscanf(f,"%d%d%d%d", &x, &y, &fl, &co);
    graf[x].push_back(y);
    capacitate[x][y] = fl;
    cost[x][y]=co;
    cost[y][x]=-co;
  }
  while ( bellmanFord() ){
    int nod=D;
    int mincapacitate = INF;
    while (nod != fost[nod]){
      if (capacitate[fost[nod]][nod]-flux[fost[nod]][nod] < mincapacitate)
        mincapacitate = capacitate[fost[nod]][nod]-flux[fost[nod]][nod];
      nod = fost[nod];
    }
    nod=D;
    while (nod != fost[nod]){
      flux[fost[nod]][nod] += mincapacitate;
      flux[nod][fost[nod]] -= mincapacitate;
      nod=fost[nod];
    }
  }
  for ( int i=1;i<=N;++i ){
    fluxtotal+=flux[S][i];
  }
  for ( int i=1;i<=N;++i ){
    for ( int j=1;j<=N;++j ){
      if ( flux[i][j]>0 )
        costtotal+=flux[i][j]*cost[i][j];
    }

  }

  //fprintf(h,"%d\n", fluxtotal);
  fprintf(h,"%d\n", costtotal);
  return 0;
}