Cod sursa(job #1409693)

Utilizator robertstrecheStreche Robert robertstreche Data 30 martie 2015 17:43:30
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>

#define NMAX 355
#define INF 0x3f3f3f3f3f

using namespace std;

bool ap[NMAX];

int boss[NMAX],best[NMAX];
int n,m,x,y,z,c,surs,dest,costmax;

int cap[NMAX][NMAX],cost[NMAX][NMAX],flow[NMAX][NMAX];

queue <int >q;
vector <int>v[NMAX];

#define DIM 10000
char buff[DIM];
int poz=0;

void citeste(int &numar)
{
     numar = 0;
     char semn='+';
     while (buff[poz] < '0' || buff[poz] > '9')
     {
          semn = buff[poz];
          if (++poz == DIM)
               fread(buff,1,DIM,stdin),poz=0;
     }
     while ('0'<=buff[poz] && buff[poz]<='9')
     {
          numar = numar*10 + buff[poz] - '0';
          if (++poz == DIM)
               fread(buff,1,DIM,stdin),poz=0;
     }
     if (semn == '-')
          numar = -numar;
}
inline bool bellman(int surs)
{
    memset(ap,0,sizeof(ap));
    for (int i=1;i<=n;i++)best[i]=INF,boss[i]=0;
    ap[surs]=1;
    q.push(surs);
    best[surs]=0;
    for (;!q.empty();q.pop())
    {
        int nod=q.front();
        ap[nod]=0;
        for (auto it:v[nod])
          if (best[it]>best[nod]+cost[nod][it] && cap[nod][it]>0)
          {
              boss[it]=nod;
              best[it]=best[nod]+cost[nod][it];
              if (!ap[it])q.push(it);
          }
    }
    return boss[dest]!=0;
}
int main()
{
   freopen("fmcm.in","r",stdin);
   freopen("fmcm.out","w",stdout);
   citeste(n);
   citeste(m);
   citeste(surs);
   citeste(dest);
   for (int i=1;i<=m;i++)
   {
       citeste(x);
       citeste(y);
       citeste(z);
       citeste(c);
       v[x].push_back(y);
       v[y].push_back(x);
       cost[x][y]=c;
       cost[y][x]=-c;
       cap[x][y]=z;
   }
   for (;bellman(surs);)
   {
       int maxflow=INF;
       for (int nod=dest;boss[nod];nod=boss[nod])
        maxflow=(maxflow>cap[boss[nod]][nod]?cap[boss[nod]][nod]:maxflow);
       for (int nod=dest;boss[nod];nod=boss[nod])
       {
           cap[boss[nod]][nod]-=maxflow;
           cap[nod][boss[nod]]+=maxflow;
           flow[boss[nod]][nod]+=maxflow;
           costmax+=cost[boss[nod]][nod]*maxflow;
       }
       //printf("%d\n",costmax);
   }
   printf("%d",costmax);

   fclose(stdin);
   fclose(stdout);
}