Cod sursa(job #2265937)

Utilizator slym777Darii Dan slym777 Data 21 octombrie 2018 22:00:11
Problema Flux maxim de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <iostream>
#include <bits/stdc++.h>
#define Nmax 500
#define pb push_back
#define inf 2000000
#define ll long long

using namespace std;

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

vector <int> V[Nmax];
int C[Nmax][Nmax],GR[Nmax][Nmax];
int tata[Nmax], dist[Nmax];

int Drum(int n, int s, int d)
{
    bool flag = true;
    int flux, x;
    for (int i = 1; i <= n; i++)
    {
        tata[i] = 0;
        dist[i] = inf;
    }
    dist[s] = 0;
    tata[s] = s;
    vector <bool> in_coada(n+1);
    queue <int> Q;
    //fout << dist[d] << endl;
    while (flag)
    {
        flag = false;
        Q.push(s);
        while(!Q.empty())
        {
            x = Q.front();
            Q.pop();
            in_coada[x] = false;
            for (auto a:V[x])
            if (GR[x][a] > 0 && dist[x] + C[x][a] < dist[a])
            {
                dist[a] = dist[x] + C[x][a];
                tata[a] = x;
                flag = true;
                if (!in_coada[a])
                {
                    Q.push(a);
                    in_coada[a] = true;
                }

            }

        }
    }
//fout << dist[d] << "\n";
    if (dist[d] < inf/2)
    {
        x = d;
        flux = inf;
        while (x != s)
        {
            flux = min(GR[tata[x]][x],flux);
            x = tata[x];
        }
        x = d;
        while (x != s)
        {
            GR[tata[x]][x] -= flux;
            GR[x][tata[x]] += flux;
            x = tata[x];
        }
        return flux*dist[d];
    }
    return 0;
}


int main()
{
    int n,m,s,d,x,y,c,z;
    ll int fluxmax = 0;
    fin >> n >> m >> s >> d;
    for (int i = 0; i < m; i++)
    {
        fin >> x >> y >> c >> z;
        GR[x][y] = c;
        C[x][y] = z;
        C[y][x] = -z;
        V[x].pb(y);
        V[y].pb(x);
    }
    x = 1;
    while (x != 0)
    {
      // fout << x << "\n";
        x = Drum(n,s,d);
        fluxmax += x;
        //fout << fluxmax;
    }
    fout << fluxmax;
    return 0;
}