Cod sursa(job #2202321)

Utilizator KenpachiDonoAndrei Grigoras KenpachiDono Data 8 mai 2018 14:01:28
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.44 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int main()
{
    vector<int> *Adiacenta;
    queue<int> Coada;
    int **Capacitate, **Flux, n, m, x, y, capacitate, OK = 1, *Vizitat, sursa, destinatie, *Tata, flux_maxim = 0;
    fin >> n >> m;
    Adiacenta = new vector<int>[n+1];
    Capacitate = new int*[n+1]();
    Vizitat = new int[n+1]();
    Flux = new int*[n+1]();
    Tata = new int[n+1]();
    for(int i = 1 ; i <= n ; i++){
        Capacitate[i] = new int[n+1]();
        Flux[i] = new int[n+1]();
    }
    for(int i = 1 ; i <= m ; i++){
        fin >> x >> y >> capacitate;
        Adiacenta[x].push_back(y);
        Capacitate[x][y] = capacitate;
    }
    fin >> sursa >> destinatie;

    while(OK){
        int Minim = 999999;
        while(!Coada.empty())
            Coada.pop();
        Coada.push(sursa);
        for(int i = 1 ; i <= n ; i++){
            Vizitat[i] = 0;
            Tata[i] = 0;
        }
        OK = 0;
        Vizitat[sursa] = 1;
        while(OK == 0 && Coada.size() != 0){
            for(unsigned int j = 0 ; j < Adiacenta[Coada.front()].size() && OK == 0; j++){
                if(Adiacenta[Coada.front()][j] == destinatie && Flux[Coada.front()][Adiacenta[Coada.front()][j]] < Capacitate[Coada.front()][Adiacenta[Coada.front()][j]]){
                    OK = 1;
                    Tata[destinatie] = Coada.front();
                    Vizitat[destinatie] = 1;
                    break;
                }
                else if(Vizitat[Adiacenta[Coada.front()][j]] == 0 && Flux[Coada.front()][Adiacenta[Coada.front()][j]] < Capacitate[Coada.front()][Adiacenta[Coada.front()][j]]){
                    Vizitat[Adiacenta[Coada.front()][j]] = 1;
                    Tata[Adiacenta[Coada.front()][j]] = Coada.front();
                    Coada.push(Adiacenta[Coada.front()][j]);
                }
            }
            for(int j = 1 ; j <= n && OK == 0 ; j++){
                if(Vizitat[j] == 0 && Flux[j][Coada.front()] != 0){
                    Coada.push(j);
                    Tata[j] = Coada.front();
                    Vizitat[j] = 1;
                }
            }
            Coada.pop();
        }
        if(OK == 1){
            int k = destinatie;
            int k1 = Tata[k];
            while(k1){
                if(Capacitate[k1][k] != 0 && Minim > Capacitate[k1][k] - Flux[k1][k])
                    Minim = Capacitate[k1][k] - Flux[k1][k];
                else if(Capacitate[k1][k] == 0 && Minim > Flux[k][k1] && Flux[k][k1] > 0)
                    Minim = Flux[k][k1];
                k = k1;
                k1 = Tata[k];
            }
            k = destinatie;
            k1 = Tata[k];
            while(k1){
                if(Capacitate[k1][k] != 0)
                    Flux[k1][k] += Minim;
                else Flux[k][k1] -= Minim;
                k = k1;
                k1 = Tata[k];
            }
            flux_maxim += Minim;
        }
    }
   // for(int i = 1 ; i <= n ; i++){
     //   for(int j = 1 ; j <= n ; j++)
       //     cout << Flux[i][j] << ' ';
        //cout<<endl;
    //}
    fout<<flux_maxim;
    delete [] Adiacenta; delete [] Tata; delete [] Vizitat;
    for(int i = 1 ; i <= n ; i++){
        delete [] Flux[i]; delete [] Capacitate[i];
    }
    delete [] Flux; delete [] Capacitate;
    return 0;
}