Cod sursa(job #1589370)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 3 februarie 2016 22:22:07
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#define DIM 355

using namespace std;

ifstream fin("fmcm.in");
ofstream fout("fmcm.out");

int N, M, S, D, minim, Cost;
bitset <DIM> inQueue;

vector <int> v[DIM];
int C[DIM][DIM];
int F[DIM][DIM];
int cost[DIM][DIM];
int Di[DIM];
int T[DIM];

queue <int> Q;

int BF(){

    for(int i=1;i<=N;i++)
        Di[i] = 0x3f3f3f3f;

    inQueue[S] = 1;
    Di[S] = 0;
    Q.push(S);

    while(!Q.empty()){
        int node = Q.front();
        inQueue[node] = 0;
        Q.pop();
        for(std::vector <int>::iterator it=v[node].begin();it!=v[node].end();it++){
            if(Di[*it] > Di[node] + cost[node][*it] && C[node][*it] > F[node][*it]){
                Di[*it] = Di[node] + cost[node][*it];
                T[*it] = node;
                if(!inQueue[*it]){
                    inQueue[*it]=1;
                    Q.push(*it);
                }
            }
        }
    }

    return Di[D] != 0x3f3f3f3f;

}

int main(){

    fin >> N >> M >> S >> D;

    while(M--){
        int x,y,c,z;
        fin >> x >> y >> c >> z;

        v[x].push_back(y);
        v[y].push_back(x);

        C[x][y] = c;
        cost[x][y] = z;
        cost[y][x] = -z;
    }

    while(BF()){
        int u=D;
        minim = 0x3f3f3f3f;

        while(T[u]!=0){
            if(minim > C[T[u]][u] - F[T[u]][u])
                minim = C[T[u]][u] - F[T[u]][u];
            u=T[u];
        }
        u=D;
        while(T[u]!=0){
            Cost += minim * cost[T[u]][u];
            F[T[u]][u] += minim;
            F[u][T[u]] -= minim;
            u = T[u];
        }
    }

    fout << Cost << "\n";

}