Cod sursa(job #1969796)

Utilizator tudi98Cozma Tudor tudi98 Data 18 aprilie 2017 17:32:41
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <bits/stdc++.h>
using namespace std;

#define REP(i,a) for (int i = 0; i < a; i++)
#define FOR(i,a,b) for (int i = a; i <= b; i++)
#define ROF(i,a,b) for (int i = a; i >= b; i--)
#define FOREACH(it,x) for (auto it: (x))
#define pb push_back
#define SZ(x) ((int)(x).size())

const int inf = 1<<30;

int n,m,source,sink;
int g[351][351];
int c[351][351];
vector<int> G[351];
int dist[351];
int T[351];
bool in_queue[351];

bool bfs()
{
    FOR(i,1,n) in_queue[i] = 0,T[i] = 0, dist[i] = inf;
    T[source] = -1; dist[source] = 0;
    queue<int> Q; Q.push(source); in_queue[source] = 1;
    while (!Q.empty()) {
        int u = Q.front(); Q.pop(); in_queue[u] = 0;
        if (u == sink) continue;
        FOREACH(it,G[u]) if (dist[it] > dist[u] + c[u][it] && g[u][it] > 0) {
            T[it] = u;
            dist[it] = dist[u] + c[u][it];
            if (!in_queue[it]) {
                in_queue[it] = 1;
                Q.push(it);
            }
        }
    }
    return dist[sink] != inf;
}

int FluxMaximCostMinim()
{
    int mincost = 0,maxflow = 0;
    while (bfs()) {
        int minflow = inf;
        for (int j = sink; j != source; j = T[j]) minflow = min(minflow,g[T[j]][j]);
        for (int j = sink; j != source; j = T[j]) {
            g[T[j]][j] -= minflow;
            g[j][T[j]] += minflow;
        }
        mincost += minflow * dist[sink];
        maxflow += minflow;
    }
    return mincost;
}

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

    fin >> n >> m >> source >> sink;
    while (m--) {
        int x,y,cap,cost;
        fin >> x >> y >> cap >> cost;
        G[x].pb(y); G[y].pb(x);
        g[x][y] = cap; c[x][y] = cost; c[y][x] = -cost;
    }
    fout << FluxMaximCostMinim();
}