Cod sursa(job #2616453)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 18 mai 2020 16:32:25
Problema Flux maxim Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.49 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>

const int MAXN = 1000 + 1;

using namespace std;

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

int flux[MAXN][MAXN],capacitate[MAXN][MAXN],dist[MAXN];
vector<int>graf[MAXN];
queue<int> coada;
int n,m;

vector<int> bfs(int sursa,int destinatie){
    for(int i = 1; i <= n; i++)
        dist[i] = n + 5;
    coada.push(sursa);
    dist[sursa] = 0;

    bool e_ok = false;
    while(coada.size()){
        int nod = coada.front();
        if(nod == destinatie){
            e_ok = true;
            while(coada.size()){
                coada.pop();
            }
            break;
        }
        coada.pop();
        for(auto const &vecin : graf[nod]){
            if(dist[nod] + 1 < dist[vecin] && flux[nod][vecin] < capacitate[nod][vecin]){
                dist[vecin] = dist[nod] + 1;
                coada.push(vecin);
            }
        }
    }
    if(!e_ok)
        return {};
    int distanta = dist[destinatie] - 1;
    int nod = destinatie;
    vector<int>drum;
    drum.push_back(destinatie);
    while(distanta >= 0){
        for(auto const &vecin : graf[nod]){
            if(dist[vecin] == distanta && flux[vecin][nod] < capacitate[vecin][nod]){
                drum.push_back(vecin);
                nod = vecin;
                distanta--;
                break;
            }
        }
    }
    reverse(drum.begin(),drum.end());
    return drum;
}


int main()
{
    in>>n>>m;
    for(int i = 1; i <= m; i++){
        int x,y,cap;
        in>>x>>y>>cap;
        graf[x].push_back(y);
        graf[y].push_back(x);
        capacitate[x][y] += cap;
        capacitate[y][x] = 0;
    }
    int ans = 0;
    while(true){
        vector<int>drum = bfs(1,n);
        if(drum.size() == 0)
            break;
//        cout<<"Drumul este : "<<"\n";
//        for(int i = 0; i < drum.size(); i++){
//            cout<<drum[i]<<" ";
//        }
        int minim = 2e9;
        for(int i = 0; i + 1 < drum.size(); i++){
            int nod1 = drum[i],nod2 = drum[i + 1];
            minim = min(minim,capacitate[nod1][nod2] - flux[nod1][nod2]);
        }
        //cout<<"Minim "<<minim<<endl;
        for(int i = 0; i + 1 < drum.size(); i++){
            int x = drum[i],y = drum[i + 1];
            flux[x][y] += minim;
            flux[y][x] -= minim;
        }
        ans += minim;
    }
    out<<ans<<"\n";
    return 0;
}