Cod sursa(job #2813293)

Utilizator StefaniaCriStefania Cristea StefaniaCri Data 6 decembrie 2021 11:29:15
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.41 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;


#define max 1024
#define inf  200004
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int visited_flux[max];
int tata[max];
int capacitate[max][max];
int flux[max][max];
vector<int> la[max];
int n,m;
int flux_bfs(int source, int sink)
     {
         queue<int> coada;
         for(int i=0;i<=n+1;i++)
         {
            visited_flux[i] = 0;
         }
         visited_flux[source]=1;
         coada.push(source);
         tata[sink] = 0;
         while(!coada.empty() && tata[sink]==0){
            int cur = coada.front();
            coada.pop();
            if(cur == sink) continue;
            for(auto vecin: la[cur])
            {
                if(capacitate[cur][vecin] - flux[cur][vecin]>0 && !visited_flux[vecin]){
                visited_flux[vecin]=1;
                coada.push(vecin);
                tata[vecin]=cur;
                }
            }
         }
         return (tata[sink]?true:false);
     }

int fluxmax()
    {
        int rasp = 0;

        for(int i=0;i<=n+1;i++)
            {
                tata[i] = 0;
            }
        while(flux_bfs(1,n)){
            for(auto vecin:la[n])
            {
                if(flux[vecin][n]!=capacitate[vecin][n] && visited_flux[vecin])
                {
                    tata[n]=vecin;
                    int fmin = inf;
                    int nod=n;
                    while(nod!=1)
                    {
                       if(capacitate[tata[nod]][nod]-flux[tata[nod]][nod]<fmin)
                            fmin = capacitate[tata[nod]][nod]-flux[tata[nod]][nod];
                       nod = tata[nod];
                    }

                    if(fmin==0) continue;

                    nod=n;
                    while(nod!=1)
                    {
                        flux[tata[nod]][nod] += fmin;
                        flux[nod][tata[nod]] -= fmin;
                        nod = tata[nod];
                    }
                    rasp += fmin;

                }
            }
        }
        return rasp;
}
int main()
{       int x,y,s;
        f>>n>>m;
        for(int i=0;i<m;i++)
        {
            f>>x>>y>>s;
            capacitate[x][y] = s;
            la[x].push_back(y);
            la[y].push_back(x);
            }


    g << fluxmax()<< endl;
    return 0;
}