Cod sursa(job #2469732)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 7 octombrie 2019 21:53:51
Problema Flux maxim de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 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[381][381],flux[381][381],z[381][381],s,d,sol,t[381],ok,C,Z;
vector <int> l[381];
bitset <381> f;

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

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

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


        for(i=0;i<l[nod].size();i++){
            vec=l[nod][i];

            if(D[vec]>D[nod]+z[nod][vec] && c[nod][vec]-flux[nod][vec]>0){
                D[vec]=D[nod]+z[nod][vec];
                t[vec]=nod;

                if(f[vec]==0){
                    f[vec]=1;
                    q.push_back(vec);
                    if(vec==d)
                        ok=1;
                }
            }
        }
    }

    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=1000000000;

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