Cod sursa(job #870183)

Utilizator mihai995mihai995 mihai995 Data 2 februarie 2013 22:46:14
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;

const int N = 351;
const int inf = 0x3f3f3f3f;

int cap[N][N], flux[N][N], cost[N][N], dist[N], T[N], n, S, D;
bool use[N];
vector<int> graph[N];
queue<int> Q;

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

inline int augment(int x, int y){
    return cap[x][y] - flux[x][y];
}

bool bf(int S, int D){
    memset(dist, inf, sizeof(dist));

    dist[S] = 0;
    Q.push(S);

    while (!Q.empty()){
        int x = Q.front(); Q.pop();

        if (x == D)
            continue;

        use[x] = false;

        for (vector<int> :: iterator it = graph[x].begin() ; it != graph[x].end() ; it++)
            if (augment(x, *it) && dist[x] + cost[x][*it] < dist[*it]){
                T[*it] = x;
                dist[*it] = dist[x] + cost[x][*it];

                if (!use[*it]){
                    use[*it] = true;
                    Q.push(*it);
                }
            }
    }

    return dist[D] != inf;
}

int maxFlow(int S, int D){
    while(bf(S, D)){
        int add = inf;

        for (int i = D ; i != S ; i = T[i])
            add = min(add, augment(T[i], i));

        for (int i = D ; i != S ; i = T[i]){
            flux[ T[i] ][i] += add;
            flux[i][ T[i] ] -= add;
        }
    }

    int C = 0;

    for (int i = 1 ; i <= n ; i++)
        for (int j = 1 ; j <= n ; j++)
            C += flux[i][j] * cost[i][j];

    return C / 2;
}

void get_graph(){
    int m, x, y;

    in >> n >> m >> S >> D;

    while (m--){
        in >> x >> y;
        in >> cap[x][y] >> cost[x][y];

        cost[y][x] = -cost[x][y];

        graph[x].push_back(y);
        graph[y].push_back(x);
    }
}

int main(){
    get_graph();

    out << maxFlow(S, D) << "\n";

    return 0;
}