Cod sursa(job #2815608)

Utilizator rimihaiMihai Radu-Ioan rimihai Data 9 decembrie 2021 21:48:45
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>
using namespace std;

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

#define flowmax 1005
vector<int> lista_adiacenta[flowmax];
bool BFSflow(int s, int fin, int f[flowmax][flowmax], int c[flowmax][flowmax], int tata[flowmax])
{
    bool vizitat[flowmax]={false};
    queue<int> q;
    q.push(s);
    vizitat[s] = true;
    while(!q.empty())
    {
        int nod = q.front();
        q.pop();
        for(auto i : lista_adiacenta[nod])
        {
            if(c[nod][i]-f[nod][i]>0 and vizitat[i] == false)
            {
                vizitat[i] = true;
                q.push(i);
                tata[i] = nod;
                if(i == fin)
                    return true;
            }
        }
    }

    return false;
}



int main()
{
    int f[flowmax][flowmax]={0};
    int c[flowmax][flowmax]={0};
    int tata[flowmax]={0};
    int n, m;
    fin >> n >> m;
    for(int i = 1; i <= m; ++i)
    {
        int a, b, fluxx;
        fin >> a >> b >> fluxx;
        lista_adiacenta[a].push_back(b);
        lista_adiacenta[b].push_back(a);
        c[a][b] = fluxx;
    }
    int flow = 0;

    while(BFSflow(1,n,f,c,tata)==true)
    {
        int fmin = INT_MAX;
        int nod = n;
        while(nod != 1)
        {
            fmin = min(fmin, c[tata[nod]][nod] - f[tata[nod]][nod]);
            nod = tata[nod];
        }
        flow += fmin;
        nod = n;
        while(nod != 1)
        {
            f[tata[nod]][nod] += fmin;
            f[nod][tata[nod]] -= fmin;
            nod = tata[nod];
        }

    }

    fout << flow;
    return 0;
}