Cod sursa(job #1224721)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 31 august 2014 18:19:50
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>
#include <algorithm>
#include <bitset>
#include <queue>

#define NMAX 355
#define VALMAX 10005
#define inf (NMAX*VALMAX)
using namespace std;

int n,s,t;
int cap[NMAX][NMAX];
int cost[NMAX][NMAX];

int dist[NMAX];
int tata[NMAX];

queue<int> coada;
bitset<NMAX> viz;

inline bool bellman(){
    for(int i=1;i<=n;i++)
        dist[i]=inf;

    dist[s]=0;
    coada.push(s);
    viz[s]=1;

    int i,y;
    while(!coada.empty()){
        y=coada.front();

        coada.pop();
        viz[y]=0;

        for(i=1;i<=n;i++)
            if(cap[y][i])
                if(dist[y]+cost[y][i]<dist[i]){
                    dist[i]=dist[y]+cost[y][i];
                    tata[i]=y;

                    if(!viz[i]){
                        coada.push(i);
                        viz[i]=1;
                    }
                }
    }

    return (dist[t]<inf);
}

inline long long int mincost_maxflow(){
    long long int mincost=0;
    while(bellman()){
        int minim=inf;
        int nod=t;

        while(tata[nod]){
            minim=min(minim,cap[tata[nod]][nod]);
            nod=tata[nod];
        }

        nod=t;
        while(tata[nod]){
            cap[tata[nod]][nod]-=minim;
            cap[nod][tata[nod]]+=minim;

            nod=tata[nod];
        }

        mincost+=(1ll*dist[t]*minim);
    }

    return mincost;
}

int main()
{
    ifstream cin("fmcm.in");
    ofstream cout("fmcm.out");

    int m=0;
    cin>>n>>m>>s>>t;

    int a,b,c,z;
    while(m--){
        cin>>a>>b>>c>>z;
        cap[a][b]=c;

        cost[a][b]=z;
        cost[b][a]=-z;
    }

    cout<<mincost_maxflow()<<'\n';

    cin.close();
    cout.close();
    return 0;
}