Cod sursa(job #1139806)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 11 martie 2014 15:08:53
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include <cstdio>
#include <algorithm>
#include <queue>
#include <bitset>
#include <vector>
#include <memory.h>

#define Nmax 355
#define INF 0x3f3f3f3f

using namespace std;

int cost[Nmax][Nmax],flow[Nmax][Nmax],capacity[Nmax][Nmax];
int DP[Nmax],daddy[Nmax];
int N,M,start,sink,maxFLOW,minCOST;

queue<int> Q;
bitset<Nmax> inQ;
vector<int> G[Nmax];

void read()
{
    scanf("%d%d%d%d",&N,&M,&start,&sink);
    int a,b,c,d;
    for(int i = 1; i <= M; ++i)
    {
        scanf("%d%d%d%d",&a,&b,&c,&d);
        G[a].push_back(b);
        G[b].push_back(a);
        capacity[a][b] = c;
        cost[a][b] = d;
        cost[b][a] = -d;
    }
}

bool BF(int k)
{
    memset(DP,INF,sizeof(DP));
    Q.push(k);
    inQ[k] = 1;
    DP[k] = 0;
    while(!Q.empty())
    {
        k = Q.front(); Q.pop(); inQ[k] = 0;
        if(k == sink) continue;
        for(vector<int>::iterator it = G[k].begin(); it != G[k].end(); ++it)
            if(DP[*it] > DP[k] + cost[k][*it] &&
               capacity[k][*it] - flow[k][*it] != 0)
            {
                DP[*it] = DP[k] + cost[k][*it];
                daddy[*it] = k;
                if(inQ[*it]) continue;
                Q.push(*it);
                inQ[*it] = 1;
            }
    }
    return DP[sink] != INF;
}

void FLOW(int k)
{
    int minFLOW,cst;
    while(BF(start))
    {
        cst = 0;
        minFLOW = INF;
        if(DP[sink] == INF) continue;

        for(int nodc = sink; nodc != start; nodc = daddy[nodc])
            minFLOW = min(minFLOW,capacity[daddy[nodc]][nodc] - flow[daddy[nodc]][nodc]);

        for(int nodc = sink; nodc != start; nodc = daddy[nodc])
        {
            flow[daddy[nodc]][nodc] += minFLOW;
            flow[nodc][daddy[nodc]] -= minFLOW;
            cst += cost[daddy[nodc]][nodc] * minFLOW;
        }
        maxFLOW += minFLOW;
        minCOST += cst;
    }
}

void print()
{
    printf("%d\n",minCOST);
    ///printf("%d\n",maxFLOW);
}

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

    read();
    FLOW(start);
    print();

    return 0;
}