Cod sursa(job #2417373)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 29 aprilie 2019 16:53:51
Problema Flux maxim de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <bitset>

#define N 355
#define INF 0x3f3f3f3f

using namespace std;

int n,m,x,y,s,d;
int c[N][N], f[N][N], z[N][N], t[N], dp[N];
bitset <N> viz;
vector <int> g[N], q;

int dfs(){
    for(int i = 1; i <= n; ++i)
        dp[i] = INF;
    viz.reset();
    dp[s]=0;
    q.clear();
    q.push_back(s);
    viz[s] = 1;
    while(!q.empty()){
        x = q.front();
        q.erase(q.begin());
        for(int y : g[x]){
            if(c[x][y] > f[x][y] && dp[x]+z[x][y]<dp[y]){
                dp[y]=dp[x]+z[x][y];
                t[y] = x;
                if(!viz[y]){
                    q.push_back(y);
                    viz[y]=1;
                }
            }
        }
        viz[x] = 0;
    }

    if(dp[d]!=INF){
        int fmin = INF;
        y = d;
        while(y!=s){
            x = t[y];
            fmin = min(fmin,c[x][y] - f[x][y]);
            y = x;
        }
        y = d;
        while(y!=s){
            x = t[y];
            f[x][y] += fmin;
            f[y][x] -= fmin;
            y=x;
        }
        return fmin*dp[d];
    }
    return 0;
}

int main()
{
    freopen("fmcm.in", "r", stdin);
    freopen("fmcm.out", "w", stdout);

    scanf("%d%d%d%d", &n,&m,&s,&d);
    for(int i=0;i<m;++i){
        scanf("%d%d", &x,&y);
        scanf("%d%d", &c[x][y], &z[x][y]);
        z[y][x] = -z[x][y];
        g[x].push_back(y);
        g[y].push_back(x);
    }

    int ok=1;
    long long rez = 0;
    while(ok){
        ok = dfs();
        rez+=1ll*ok;
    }

    cout<<rez;

    return 0;
}