Cod sursa(job #977121)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 24 iulie 2013 19:52:20
Problema Flux maxim de cost minim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.09 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <utility>
#include <string.h>

using namespace std;

ifstream cin("fmcm.in");
ofstream cout("fmcm.out");

const int MAXN = 355;
const int oo = 0x3f3f3f3f;

typedef vector<int> Graph[MAXN];
typedef vector<int> :: iterator It;

Graph G;
int N, M, Node, Source, Sink, Qu[MAXN][MAXN], Cost[MAXN][MAXN], MinCostFlow;
vector<int>Old(MAXN), Distance(MAXN) , Act(MAXN), Father(MAXN);
priority_queue <pair<int, int> , vector<pair <int, int> >, greater <pair<int, int> > > Q;

bool Dijkstra() {
    fill(Distance.begin(), Distance.end() , oo);
    for(Q.push(make_pair(0, Source)), Node = Source, Distance[Source] = 0, Act[Source] = 0; !Q.empty() ; Q.pop(), Node = Q.top().second){
        if( Distance[Node] != Q.top().first ) continue;
        for(It it = G[Node].begin() , fin = G[Node].end() ; it != fin ; ++ it){
            if(Qu[Node][*it]) {
                int act = Cost[Node][*it] + Old[Node] - Old[*it];
                if(Distance[*it] > Distance[Node] + act){
                    Distance[*it] = Distance[Node] + act;
                    Father[*it] = Node;
                    Act[*it] = Act[Node] + Cost[Node][*it];
                    Q.push(make_pair(Distance[*it], *it));
                }
            }
        }
    }
    Old = Act;
    return Distance[Sink] != oo;
}

void Handle_Flow() {
    int MinFlow = oo;
    for(int i = Sink ; i != Source ; i = Father[i])
        MinFlow = min ( MinFlow, Qu[Father[i]][i]);
    for(int i = Sink; i != Source; i = Father[i])
        Qu[Father[i]][i] -= MinFlow,
        Qu[i][Father[i]] += MinFlow;
    MinCostFlow += (MinFlow * Act[Sink]);
}

int main() {
    for( cin >> N >> M >> Source >> Sink ; M ; -- M){
        int X, Y;
        cin >> X >> Y;
        G[X].push_back(Y);
        G[Y].push_back(X);
        cin >> Qu[X][Y] >> Cost[X][Y];
        Cost[Y][X] = -Cost[X][Y];
    }
    while(Dijkstra())
        Handle_Flow();
    cout << MinCostFlow << "\n";
    cin.close();
    cout.close();
    return 0;
}