Cod sursa(job #1968392)

Utilizator Radu_GeorgeRadu George Radu_George Data 17 aprilie 2017 17:47:42
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>
#define Nmax 355
#define pb push_back
#define INF 1000000000

using namespace std;

int C[Nmax][Nmax],Cost[Nmax][Nmax],F[Nmax][Nmax],dist[Nmax],prv[Nmax],S,D,n;
bool seen[Nmax];
vector <int> L[Nmax];
queue <int> Q;

inline void add_edge(int x, int y, int cap, int cost)
{
    L[x].pb(y); L[y].pb(x);
    C[x][y]=cap; Cost[x][y]=cost;
    Cost[y][x]=-cost;
}

inline bool Bellman()
{
    int i,nod;
    for(i=1;i<=n;++i) dist[i]=INF;
    dist[S]=0; Q.push(S);
    while(!Q.empty())
    {
        nod=Q.front(); Q.pop();
        seen[nod]=0;
        for(auto it : L[nod])
            if(F[nod][it]<C[nod][it] && dist[it] > dist[nod]+Cost[nod][it])
            {
                dist[it] = dist[nod]+Cost[nod][it];
                prv[it]=nod;
                if(!seen[it])
                {
                    Q.push(it);
                    seen[it]=1;
                }
            }
    }
    return (dist[D]!=INF);
}

inline int Flow()
{
    int min_flow,cost=0,i;
    while(Bellman())
    {
        min_flow=INF;
        for(i=D;i!=S;i=prv[i])
            min_flow=min(min_flow,C[prv[i]][i]-F[prv[i]][i]);
        for(i=D;i!=S;i=prv[i])
        {
            cost+=min_flow*Cost[prv[i]][i];
            F[prv[i]][i]+=min_flow;
            F[i][prv[i]]-=min_flow;
        }
    }
    return cost;
}

int main()
{
    int x,y,cap,cost,m;
    ifstream cin("fmcm.in");
    ofstream cout("fmcm.out");
    cin>>n>>m>>S>>D;
    while(m--)
    {
        cin>>x>>y>>cap>>cost;
        add_edge(x,y,cap,cost);
    }
    cout<<Flow()<<"\n";
    return 0;
}