Cod sursa(job #1934093)

Utilizator MithrilBratu Andrei Mithril Data 21 martie 2017 09:51:16
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>
#define NMAX 510
#define INF 2000000000
using namespace std;

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

int n,m,s,d;
vector<int> adj[NMAX];
int dist[NMAX],parent[NMAX];
queue<int> Q;
bitset<NMAX> inQueue;
int c[NMAX][NMAX],f[NMAX][NMAX],cost[NMAX][NMAX];
bool ok;

int bellmanFord() {

    fill(dist+0,dist+n+1,INF);
    fill(parent+0,parent+n+1,-1);
    dist[s]=0;
    Q.push(s);
    inQueue.reset();
    inQueue[s]=1;

    while(Q.size()) {
        int aux=Q.front();
        inQueue[aux]=0;
        Q.pop();

        for(auto q:adj[aux]) {
            if(c[aux][q]-f[aux][q]>0&&dist[aux]+cost[aux][q]<dist[q]) {

                dist[q]=dist[aux]+cost[aux][q];
                parent[q]=aux;
                if(!inQueue[q]) {

                    Q.push(q);
                    inQueue[q]=1;
                }
            }
        }
    }
    if(dist[d]!=INF) {
        int fMin = INF;
        ok=1;
        for(int i=d;i!=s;i=parent[i])  fMin=min(fMin,c[parent[i]][i]-f[parent[i]][i]);

        for(int i=d;i!=s;i=parent[i]) {
            f[parent[i]][i]+=fMin;
            f[i][parent[i]]-=fMin;
        }
        return fMin*dist[d];
    }
    return 0;
}

int main()
{
    fin>>n>>m>>s>>d;
    for(int i=1;i<=m;i++) {
        int x,y,z,cap;
        fin>>x>>y>>cap>>z;

        adj[x].push_back(y);
        adj[y].push_back(x);
        c[x][y]=cap;
        cost[x][y]=z;
        cost[y][x]=-z;
    }

    int64_t result=0;
    ok=1;
    while(ok) {
        ok=0;
        result += bellmanFord();
    }
    fout<<result;
    return 0;
}