Cod sursa(job #2495486)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 19 noiembrie 2019 15:25:15
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
/// 15:13 - 15:24
#include <bits/stdc++.h>
#define DIM 400
#define INF 2000000000
using namespace std;

ifstream fin ("fmcm.in");
ofstream fout ("fmcm.out");
vector <int> L[DIM];
deque <int> c;
int capacitate[DIM][DIM],flux[DIM][DIM],cst[DIM][DIM],viz[DIM],t[DIM],dist[DIM];
int n,m,i,x,y,cap,cost,sursa,dest;
int bellman_ford (int sursa, int dest){
    for (int i=1;i<=n;i++){
        viz[i] = t[i] = 0;
        dist[i] = INF;
    }
    c.clear();
    c.push_back(sursa);
    viz[sursa] = 1, dist[sursa] = 0;
    while (!c.empty()){
        int nod = c.front();
        c.pop_front();
        viz[nod] = 0;
        for (int i=0;i<L[nod].size();i++){
            int vecin = L[nod][i];
            if (flux[nod][vecin] < capacitate[nod][vecin] && dist[nod]+cst[nod][vecin] < dist[vecin]){
                dist[vecin] = dist[nod] + cst[nod][vecin];
                t[vecin] = nod;
                if (!viz[vecin]){
                    viz[vecin] = 1;
                    c.push_back(vecin);
                }}}}
    return dist[dest] != INF;
}
int main (){

    fin>>n>>m>>sursa>>dest;
    for (i=1;i<=m;i++){
        fin>>x>>y>>cap>>cost;
        L[x].push_back(y);
        L[y].push_back(x);
        capacitate[x][y] = cap;
        cst[x][y] = cost, cst[y][x] = -cost;
    }
    int sol = 0;
    while (bellman_ford(sursa,dest)){
        int x = dest, dif = INF;
        while (x != sursa){
            dif = min (dif,capacitate[t[x]][x] - flux[t[x]][x]);
            x = t[x];
        }
        x = dest;
        while (x != sursa){
            sol += cst[t[x]][x]*dif;
            flux[t[x]][x] += dif;
            flux[x][t[x]] -= dif;
            x = t[x];
        }}
    fout<<sol;



    return 0;
}