Cod sursa(job #1150326)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 22 martie 2014 20:52:35
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.25 kb
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#define Nmax 355
#define Mmax 12509
#define oo 2000000000
#define pb push_back
#define y first
#define c second
#define DEBUG 0
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");

int N,M,Source,Sink,x,y,c,z,MaxFlow,CostMin,used[Nmax];
int cap[Nmax][Nmax],cost[Nmax][Nmax],flow[Nmax][Nmax],ante[Nmax],d[Nmax];
vector < int > G[Nmax];
bitset < Nmax > inQ,viz;
queue < int > Q;

inline void ReadInput()
{
    f>>N>>M>>Source>>Sink;
    for(int i=1;i<=M;++i)
        f>>x>>y>>c>>z ,    G[x].pb(y) ,   G[y].pb(x) ,
                         cap[x][y]=c ,  cap[y][x]=0,
                        cost[x][y]=z , cost[y][x]=-z;
}

int Bellmanford(int Source)
{
    for(int i=1;i<=N;++i)d[i]=oo,ante[i]=oo,used[i]=0;
    d[Source]=0 , ante[Source]=Source ,  inQ[Source]=1;
    for(Q.push(Source); !Q.empty();Q.pop())
    {
        int node=Q.front();
        inQ[node]=0; ++used[node];
        if(used[node]==N)return 0;
        for(vector < int > ::iterator it=G[node].begin();it!=G[node].end();++it)
            if(d[*it]>d[node]+cost[node][*it] && flow[node][*it]<cap[node][*it])
            {
                d[*it]=d[node]+cost[node][*it];
                ante[*it]=node;
                if(!inQ[*it])Q.push(*it) , inQ[*it]=1;
            }
    }
    if(DEBUG){for(int i=1;i<=N;++i)g<<d[i]<<' ';g<<'\n';}
    if(d[Sink]!=oo)
    {
        if(DEBUG) g<<"Avem drum ::"<<d[Sink]<<" prin "<<ante[Sink]<<'\n';
        int MinFlow=oo;
        for(int i=Sink; i!=Source ; i=ante[i])
            MinFlow=min(MinFlow,cap[ante[i]][i]-flow[ante[i]][i]);
        if(MinFlow)
        {
            if(DEBUG) g<<"Update cu "<<MinFlow<<'\n';
            for(int i=Sink; i!=Source ; i=ante[i])
            {
                flow[ante[i]][i]+=MinFlow;
                flow[i][ante[i]]-=MinFlow;
            }
        }
        return MinFlow;
    }
    return 0;

}

int main()
{
    ReadInput();
    //Bellmanford(Source);
    int mlc=Bellmanford(Source);
    while(mlc)
    {
        CostMin+=mlc*d[Sink];
        if(DEBUG)g<<mlc<<' '<<CostMin<<"\n\n";
        mlc=Bellmanford(Source);
    }
    g<<CostMin<<'\n';
    f.close();g.close();
    return 0;
}