Cod sursa(job #931771)

Utilizator PatrikStepan Patrik Patrik Data 28 martie 2013 14:46:07
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
    #include<cstdio>
    #include<vector>
    #include<queue>
    #include<cstring>
    using namespace std;
    #define MAX 651
    #define pb push_back
    #define INF 1000000
    #define mp make_pair
    int N ,M ,S,D , d[MAX],f[MAX][MAX] , c[MAX][MAX] , p[MAX] , fmin;
    vector<pair<int,int> > G[MAX];
    queue<int> Q;
    bool inq[MAX];
    long long cost;

    void citire();
    void solve();
    bool b_ford();
    void tipar();

    int main()
    {
        citire();
        solve();
        tipar();
        return 0;
    }

    void citire()
    {
        int y , z , cap , x;
        freopen("fmcm.in" , "r" , stdin);
        scanf("%d%d%d%d" , &N ,&M , &S ,&D);
        for(;M;--M)
        {
            scanf("%d%d%d%d" , &x ,&y , &cap , &z);
            G[x].pb(mp(y,z));
            G[y].pb(mp(x,-z));
            c[x][y] = cap;
        }
    }

    void solve()
    {
        while(b_ford())
        {
                fmin = INF;
                for(int nod = D ; nod !=S ; nod = p[nod])
                    fmin = min(fmin,c[p[nod]][nod]-f[p[nod]][nod]);
                for(int nod = D ; nod !=S ; nod = p[nod])
                {
                    f[p[nod]][nod] += fmin;
                    f[nod][p[nod]] -=fmin;
                }
                cost+=d[D]*fmin;

        }
    }

    bool b_ford()
    {
        for(int i = 1 ; i <= N ; ++i )d[i] = INF;
        memset(inq,0,sizeof(inq));
        d[S] = 0;inq[S] = 1;
        Q.push(S);
        for(;!Q.empty();Q.pop())
        {
            int n = Q.front();
            inq[n] = 0;
            if(n==D)continue;
            for(int j = 0 ; j <(int)G[n].size() ; ++j )
            {
                int next = G[n][j].first;
                int cost = G[n][j].second;
                if(f[n][next] == c[n][next])continue;
                if(d[n]+cost<d[next])
                {
                    p[next] = n;
                    d[next] = d[n] +cost;
                    if(inq[next])continue;
                    inq[next] = 1;
                    Q.push(next);
                }
            }
        }
        return (d[D]!=INF);
    }

    void tipar()
    {
        freopen("fmcm.out" , "w" , stdout);
        printf("%lld\n" , cost);
    }