Cod sursa(job #2469842)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 8 octombrie 2019 08:06:43
Problema Flux maxim de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>
#define inf 10000000
#define dim 353
using namespace std;

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

int n,m,nod,vec,i,j,c[dim][dim],flux[dim][dim],z[dim][dim],s,d,sol,C,Z;
vector <short> l[dim];
short t[dim];
bool ok,f[dim];

int D[dim];
deque <short> q;

bool bell(){
    memset(f,0,sizeof(f));
    for(i = 1; i <= n; i++)
        D[i] = inf;
    D[s] = 0;
    q.push_back(s);
    ok = 0;

    while(!q.empty()){
        nod=q.front();
        q.pop_front();
        f[nod]=0;
        if(nod==d)
            ok = 1;

        for(i=0;i<l[nod].size();i++){
            vec = l[nod][i];
            if(c[nod][vec]>flux[nod][vec] && D[vec]>D[nod]+z[nod][vec]){
                D[vec] = D[nod] + z[nod][vec];
                t[vec] = nod;
                if(!f[vec]){
                    f[vec] = 1;
                    q.push_back(vec);
                }
            }
        }
    }

    return ok;
}

int main(){
    fin>>n>>m>>s>>d;
    for(;m;m--){
        fin>>i>>j>>C>>Z;
        c[i][j] = C;
        z[i][j] = Z;
        z[j][i] = -Z;
        l[i].push_back(j);
        l[j].push_back(i);
    }

    while(bell()){
        nod=d;
        m=2*inf;

        while(nod!=s){
            m=min(m,c[t[nod]][nod]-flux[t[nod]][nod]);
            nod=t[nod];
        }

        nod=d;
        while(nod!=s){
            flux[t[nod]][nod] += m;
            flux[nod][t[nod]] -= m;
            nod = t[nod];
        }
        sol += m*D[d];
    }
    fout<<sol;

    return 0;
}