Cod sursa(job #2550336)

Utilizator PaulOrasanPaul Orasan PaulOrasan Data 18 februarie 2020 18:45:44
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

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

const int NMAX=1010;

int n,m;
vector<int>lista[NMAX];
int c[NMAX][NMAX], f[NMAX][NMAX];
int lant[NMAX];
void citire()
{
    fin>>n>>m;
    int a,b,cost;
    for (int i=1; i<=m; i++){
        fin>>a>>b>>cost;
        lista[a].push_back(b);
        lista[b].push_back(a);
        c[a][b]=cost;
    }
}
int bfs()
{
    queue<int>q;
    q.push(1);
    int pre[n+1];
    for (int i=1; i<=n; i++)
        pre[i]=0;
    pre[1]=-1;
    int top,nr;
    bool gata=false;
    while (!gata && !q.empty()){
        top=q.front();
        q.pop();
        nr=lista[top].size();
        for (int i=0; i<nr; i++){
            if (pre[lista[top][i]]==0){
                if (f[top][lista[top][i]]<c[top][lista[top][i]]){
                    pre[lista[top][i]]=top;
                    q.push(lista[top][i]);
                    if (lista[top][i]==n){
                        gata=true;
                    }
                }
            }
        }
    }
    if (gata){
        int ind=n;
        lant[0]=0;
        while (ind!=-1){
            lant[0]++;
            lant[lant[0]]=ind;
            ind=pre[ind];
        }
        int minim=10000000;
        for (int i=lant[0]; i>1; i--){
            minim=min(minim,c[lant[i]][lant[i-1]]-f[lant[i]][lant[i-1]]);
        }
        return minim;
    }
    return 0;
}
void afisare()
{
    for (int i=1; i<=n; i++){
        for (int j=1; j<=n; j++){
            fout<<f[i][j]<<' ';
        }
        fout<<'\n';
    }
}
int calculareFlux()
{
    int val=bfs();
    int suma=0;
    while (val!=0){
        for (int i=lant[0]; i>1; i--){
            f[lant[i]][lant[i-1]]+=val;
            f[lant[i-1]][lant[i]]-=val;
        }
        val=bfs();
    }
    for (int i=0; i<lista[1].size(); i++){
        suma+=f[1][lista[1][i]];
    }
    return suma;
}
int main()
{
    citire();
    fin.close();
    fout<<calculareFlux()<<'\n';
    return 0;
}