Cod sursa(job #1224722)

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

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

int n,s,t;

vector<int> graf[NMAX];
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 y;
    vector<int>::iterator it;

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

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

        for(it=graf[y].begin();it!=graf[y].end();it++)
            if(cap[y][*it])
                if(dist[y]+cost[y][*it]<dist[*it]){
                    dist[*it]=dist[y]+cost[y][*it];
                    tata[*it]=y;

                    if(!viz[*it]){
                        coada.push(*it);
                        viz[*it]=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;

        graf[a].push_back(b);
        graf[b].push_back(a);

        cap[a][b]=c;

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

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

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