Cod sursa(job #2204969)

Utilizator Andrei243Nitu Mandel Andrei Andrei243 Data 17 mai 2018 13:34:55
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.09 kb
#include <bits/stdc++.h>

using namespace std;



bool se_poate(vector<vector<int> >&lista_adiacenta,int nod_terminal, vector<vector<int > >& flux,vector<vector<int> >&capacitate  )
{
    vector<bool> vizitat(nod_terminal+1,false);
    vector<int> tati(nod_terminal+1,-1);

    tati[1]=1;
    vizitat[1]=true;
    queue<int> coada;
    coada.push(1);

    while(!coada.empty())
    {
        int aux=coada.front();
        coada.pop();
        for(unsigned int i=0; i<lista_adiacenta[aux].size(); i++)
        {
            int y=lista_adiacenta[aux][i];

            if(!vizitat[y]&&( capacitate[aux][y]>flux[aux][y] )   )
            {
                tati[y]=aux;
                coada.push(y);
                vizitat[y]=true;



            }



        }




    }
    if(tati[nod_terminal]==-1)return false;

    int it=nod_terminal;
    int min_fl=120000;

    while(tati[it]!=it)
    {
        int rez=capacitate[tati[it]][it]-flux[tati[it]][it];
        if(rez<min_fl)min_fl=rez;

        it=tati[it];

    }
 it=nod_terminal;
    while(tati[it]!=it)
    {

        flux[tati[it]][it]+=min_fl;
        flux[it][tati[it]]-=min_fl;
        it=tati[it];

    }
    return true;
}

int main()
{

    vector<vector<int> > capacitati;
    vector<vector<int> > flux;


    vector<vector<int> > cost_graf_rezidual;
    vector<vector<int> >lista_adiacenta_rez;

    ifstream in("maxflow.in");
    ofstream out("maxflow.out");
    int nr_noduri;
    in>>nr_noduri;
    flux = vector< vector<int> >(nr_noduri+1, vector<int>(nr_noduri+1, 0));
    capacitati = flux;
    lista_adiacenta_rez=vector<vector<int> >(nr_noduri+1,vector<int>(0,0));

    int nr_arce;
    in>>nr_arce;

    for(int i=0; i<nr_arce; i++)
    {
        int x,y,capacitate;
        in>>x>>y>>capacitate;

        lista_adiacenta_rez[x].push_back(y);
        lista_adiacenta_rez[y].push_back(x);

        capacitati[x][y]+=capacitate;


    }


    while(se_poate(lista_adiacenta_rez,nr_noduri,flux,capacitati)) {}


    int sum=0;
    for(unsigned int i=0; i<lista_adiacenta_rez[1].size(); i++)sum+=flux[1][lista_adiacenta_rez[1][i]];

    out<<sum<<'\n';

    return 0;
}