Cod sursa(job #1687861)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 13 aprilie 2016 09:26:33
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <bits/stdc++.h>

using namespace std;

const int nmax = 350 + 10;
const int inf = 0x3f3f3f3f;

int n , m , i , S , D , mincost;
int dad[nmax] , bst[nmax];
int c[nmax][nmax] , f[nmax][nmax] , p[nmax][nmax];

bool used[nmax];

vector < int > g[nmax];
queue < int > q;

void add(int x , int y , int C , int P)
{
    g[x].push_back(y);
    g[y].push_back(x);

    c[x][y] = C;
    p[x][y] = P; p[y][x] = -P;
}

bool bfs()
{
    memset(dad , -1 , sizeof(dad));
    memset(bst , inf , sizeof(bst));
    memset(used , 0 , sizeof(used));

    q.push(S); used[S] = 1; bst[S] = 0; dad[S] = -2;
    while (q.size())
    {
        int node = q.front(); q.pop();
        used[node] = 0;

        for (auto &it : g[node])
        {
            if (c[node][it] > f[node][it]); else continue;

            if (bst[it] > bst[node] + p[node][it])
            {
                dad[it] = node;
                bst[it] = bst[node] + p[node][it];
                if (!used[it])
                    used[it] = 1, q.push(it);
            }
        }
    }

    return (dad[D] != -1);
}

void bagaflux()
{
    while (bfs())
    {
        int minn = inf;
        for (int node = D; node != S; node = dad[node])
            minn = min(minn , c[dad[node]][node] - f[dad[node]][node]);

        if (minn <= 0) continue; ///plm

        mincost += bst[D] * minn;
        for (int node = D; node != S; node = dad[node])
            f[dad[node]][node] += minn,
            f[node][dad[node]] -= minn;
    }
}

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

    scanf("%d %d %d %d", &n, &m, &S, &D);

    for (i = 1; i <= m; ++i)
    {
        int x , y , z , t;
        scanf("%d %d %d %d", &x, &y, &z, &t);

        add(x , y , z , t);
    }

    bagaflux();

    printf("%d\n", mincost);

    return 0;
}