Cod sursa(job #2582305)

Utilizator SoranaAureliaCatrina Sorana SoranaAurelia Data 16 martie 2020 16:19:31
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>

#define NMAX 1005
#define oo 0x3f3f3f2f
using namespace std;

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

int n, m;
int x, y, capacitate;
int viz[NMAX], tati[NMAX];
int flow[NMAX][NMAX], total_capacity[NMAX][NMAX];

queue<int>Q;
vector<int>graph[NMAX];

void citire(){
    f>>n>>m;
    for(int i=1; i<=m; i++){
        f>>x>>y>>capacitate;
        graph[x].push_back(y);
        graph[y].push_back(x);
        total_capacity[x][y] = capacitate;
    }
}

int bfs(){
    memset(viz, 0, sizeof(viz));

    Q.push(1);
    viz[1] = 1;

    while(!Q.empty()){
        int vf = Q.front();
        Q.pop();
        if(vf == n)
            continue;    //pt a goli totusi coada

        for(auto &v:graph[vf])
            if(viz[v] == 0 && total_capacity[vf][v]!=flow[vf][v]){
                viz[v] = 1;
                tati[v] = vf;
                Q.push(v);
            }
    }

    return viz[n];       // daca am ajuns la n
}
int solve(){
   int totalFlow = 0;      // in total

   while(bfs()){         // cat timp exista drum catre n
        for(auto &v:graph[n]){
            if(total_capacity[v][n] == flow[v][n] || !viz[v]) // daca nu am trecut prin v sau deja am avut flow maxim pe acel drum (flow-ul
                continue;                                 // care ar trebui trimis ar fi 0)

            int maxFlowToSend = oo;
            tati[n] = v;

            for(int i=n; i>1; i=tati[i])
                maxFlowToSend = min(maxFlowToSend, total_capacity[tati[i]][i] - flow[tati[i]][i]);
            if(maxFlowToSend == 0) // drumul trce printr-o muchie care are deja flow maxim
                continue;

            for(int i=n; i>1; i=tati[i]){
                flow[tati[i]][i] += maxFlowToSend;
                flow[i][tati[i]] -= maxFlowToSend;
            }

            totalFlow += maxFlowToSend;
        }
   }
   return totalFlow;

}
int main()
{
    citire();
    g<<solve();
    return 0;
}