Cod sursa(job #1140300)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 11 martie 2014 21:39:06
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#include <memory.h>

#define Nmax 355
#define adaos 1666
#define INF 0x3f3f3f3f

using namespace std;

vector<int> G[Nmax];
priority_queue<pair<int,int>,
        vector<pair<int,int> > ,
       greater<pair<int,int> > > Heap;

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

inline 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 + adaos;
        cost[b][a] = - d + adaos;/// YOLO
    }
}

inline bool PFS(int k)
{
    memset(DP,INF,sizeof(DP));
    Heap.push(make_pair(0,k));
    DP[k] = 0;
    while(!Heap.empty())
    {
        k = Heap.top().second;Heap.pop();
        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] )
            {
                DP[*it] = DP[k] + cost[k][*it];
                daddy[*it] = k;
                Heap.push(make_pair(DP[*it],*it));
            }
    }
    return DP[sink] != INF;
}

inline void FLOW()
{
    while(PFS(start))
    {
        if(DP[sink] == INF) continue;
        minFLOW = INF;cst = 0;
        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]] -= maxFLOW;
            minCOST += (cost[daddy[nodc]][nodc] - adaos)* minFLOW;
        }
        maxFLOW += minFLOW;
    }
}

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

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

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

    return 0;
}