Cod sursa(job #1684798)

Utilizator ZenusTudor Costin Razvan Zenus Data 11 aprilie 2016 12:10:11
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include <bits/stdc++.h>

using namespace std;

const int nmax = 359;

int n , m , a , b , v , p , i;

class network
{
    private :
    int flow[nmax][nmax];
    int price[nmax][nmax];
    int volume[nmax][nmax];
    vector < int > g[nmax];
    int link[nmax] , len[nmax] , in[nmax];
    queue < int > iq;

    bool path()
    {
        int i , r , x;

        for (i = 1 ; i <= n ; ++i)
        len[i] = (1 << 30) , link[i] = 0 , in[i] = 0;

        iq.push(source) , in[source] = 1 , len[source] = 0;

        while (iq.size())
        {
            x = iq.front();
            iq.pop();
            in[x] = 0;

            for (int i = 0 ; i < g[x].size() ; ++i)
            {
                r = g[x][i];
                if (len[x] + price[x][r] < len[r] && volume[x][r] > flow[x][r])
                {
                    len[r] = len[x] + price[x][r];
                    link[r] = x;

                    if (in[r]);
                    else iq.push(r) , in[r] = 1;
                }
            }
        }

        return link[sink];
    }


    public :
    int answer , source , sink , n;

    void add(int a , int b , int v , int p)
    {
        g[a].push_back(b);
        g[b].push_back(a);
        volume[a][b] = v;
        price[a][b] = p;
        price[b][a] = -p;
    }

    void work()
    {
        int t , i;

        while (path())
        {
            t = (1 << 30);
            for (i = sink ; i - source ; i = link[i])
            t = min(t , volume[link[i]][i] - flow[link[i]][i]);

            answer += t * len[sink];

            for (i = sink ; i - source ; i = link[i])
            {
                flow[link[i]][i] += t;
                flow[i][link[i]] -= t;
            }
        }
    }
} solve;

int main()
{
freopen("fmcm.in" , "r" , stdin);
freopen("fmcm.out" , "w" , stdout);

scanf("%d" , &n);
scanf("%d" , &m);
scanf("%d" , &solve.source);
scanf("%d" , &solve.sink);

for (i = 1 ; i <= m ; ++i)
{
    scanf("%d" , &a);
    scanf("%d" , &b);
    scanf("%d" , &v);
    scanf("%d" , &p);

    solve.add(a , b , v ,p);
}

solve.n = n;

solve.work();
printf("%d\n" , solve.answer);

return 0;
}