Cod sursa(job #2469742)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 7 octombrie 2019 22:13:33
Problema Flux maxim de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <deque>
#include <climits>
using namespace std;

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

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

int D[351];
deque <int> q;

bool bell(){
    f.reset();
    for(i=1;i<=n;i++)
        D[i]=10000000;
    D[s]=0;
    f[s]=1;
    q.push_back(s);
    ok=0;

    while(!q.empty()){
        nod=q.front();
        f[nod]=0;
        q.pop_front();
        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;
        fin>>c[i][j]>>z[i][j];
        z[j][i]=-z[i][j];
        l[i].push_back(j);
        l[j].push_back(i);
    }

    while(bell()){
        nod=d;
        m=10000000;

        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;
}