Cod sursa(job #2130619)

Utilizator MaaaaaCristina Ma Maaaaa Data 13 februarie 2018 19:40:28
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <fstream>
#include <string.h>
#include <stdlib.h>
#include <vector>
#define nmax 355
using namespace std;
fstream f1("fmcm.in", ios::in);
fstream f2("fmcm.out", ios::out);
int n, m, S, D, cost[nmax][nmax], cap[nmax][nmax], flux[nmax][nmax], viz[nmax], dist[nmax], coada[12505], prim, ultim, k, l[nmax], fmax;
vector <int> v[nmax];
void citire()
{
    int i, x, y, c, ct;
    f1>>n>>m>>S>>D;
    for(i=1; i<=m; i++)
    {
        f1>>x>>y>>c>>ct;
        cost[x][y]=ct;
        cost[y][x]=-ct;
        cap[x][y]=c;
        cap[y][x]=0;///nu exista arc y->x
        v[x].push_back(y);
        v[y].push_back(x);
    }
}
void init()
{
    int i;
    memset(viz, 0, sizeof(viz));
    memset(l, 0, sizeof(l));
    for(i=1; i<=n; i++) dist[i]=1000000000;
    viz[S]=1;
    dist[S]=0;
    prim=ultim=k=1;
    coada[prim]=S;
}
int bellmanford()
{
   init();
   int nod, vec;
   while(k!=0)
   {
        nod=coada[prim]; viz[nod]=0;
        prim++; k--;
        if(prim> 12500) prim=1;
        for(auto it=v[nod].begin(); it!=v[nod].end(); ++it)
        {
            vec=*it;
            if((dist[vec]> dist[nod]+cost[nod][vec])&&(cap[nod][vec]-flux[nod][vec]> 0))
            {
               dist[vec]= dist[nod]+cost[nod][vec];
               l[vec]=nod;
               if(!viz[vec])
               {
                   viz[vec]=1;
                   ultim++; k++;
                   if(ultim> 12500) ultim=1;
                   coada[ultim]=vec;
               }
            }
        }
   }
   return l[D];
}
void amelioreaza()
{
    int i, mini=10005;
    for(i=D; i!=S; i=l[i])
        mini=min(mini, cap[l[i]][i]-flux[l[i]][i]);
    for(i=D; i!=S; i=l[i])
    {
        flux[l[i]][i]+=mini;
        flux[i][l[i]]-=mini;
    }
    fmax+=dist[D]*mini;
}
int main()
{
    citire();
    while(bellmanford())
    {
        amelioreaza();
    }
    f2<<fmax;
    return 0;
}