Cod sursa(job #1955441)

Utilizator MithrilBratu Andrei Mithril Data 5 aprilie 2017 23:16:44
Problema Cuplaj maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>
#define NMAX 360
#define INF 2000000000

using namespace std;

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

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

int bellman() {
    fill(dist+1,dist+n+1,INF);
    fill(parent+1,parent+n+1,INF);
    Q.push(s);
    inQ.reset();
    dist[s]=0;
    inQ[s]=1;

    for(;Q.size();Q.pop()) {
        int aux=Q.front();
        inQ[aux]=0;

        for(auto q:g[aux]) {
            if(c[aux][q]-f[aux][q]>0&&dist[q]>dist[aux]+cost[aux][q]) {
                parent[q]=aux;
                dist[q]=dist[aux]+cost[aux][q];

                if(!inQ[q]) {
                    inQ[q]=1;
                    Q.push(q);
                }
            }
        }
    }

    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,w,z;
        fin>>x>>y>>w>>z;
        g[x].push_back(y);
        g[y].push_back(x);
        c[x][y]=w;
        cost[x][y]=z;
        cost[y][x]=-z;
    }
    ok=1;
    int64_t result=0;
    while(ok) {
        ok=0;
        result+=bellman();
    }
    fout<<result;
    return 0;
}