Cod sursa(job #2444243)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 30 iulie 2019 18:13:50
Problema Flux maxim Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <fstream>
#include <vector>
#include <deque>
#define DIM 1002
#define INF 2000000000
using namespace std;

ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
vector <int> edges[DIM],L[DIM];
deque <int> c;
int n,m,x,y,z,i;
int cap[DIM][DIM],dist[DIM];
void bfs (int sursa, int dest){
    for (int i=1;i<=n;i++)
        dist[i] = INF;
    dist[sursa] = 0;
    c.clear();
    c.push_back(sursa);
    while (!c.empty()){
        int nod = c.front();
        if (nod == dest)
            break;
        c.pop_front();
        for (int i=0;i<L[nod].size();i++){
            int vecin = L[nod][i];
            if (!cap[nod][vecin])
                continue;
            if (dist[vecin] == INF){
                dist[vecin] = 1 + dist[nod];
                c.push_back(vecin);
            }
            if (dist[nod]+1 == dist[vecin])
                edges[nod].push_back(vecin); /// am un subgraf pe care o sa bag flux
        }}}
int dfs (int nod, int dest, int maxflow){
    /// dfs ul il fac pe graful de nivele.
    if (maxflow == 0) /// nu mai are sens sa continui
        return 0;
    if (nod == dest)
        return maxflow;
    int flow = 0;
    for (int i=0;i<edges[nod].size();i++){
        int vecin = edges[nod][i];
        if (!cap[nod][vecin])
            continue;
        int val = dfs (vecin,dest,min(cap[nod][vecin],maxflow-flow));
        cap[nod][vecin] -= val;
        cap[vecin][nod] += val;
        flow += val;
    }
    return flow;
}
int main (){

    fin>>n>>m;
    for (i=1;i<=m;i++){
        fin>>x>>y>>z;
        L[x].push_back(y);
        L[y].push_back(x);
        cap[x][y] = z;
    }
    int sursa = 1, dest = n, sol = 0, flux;
    do{
        bfs(sursa,dest);
        flux = dfs (sursa,dest,INF);
        sol += flux;
    } while (flux);

    fout<<sol;

    return 0;
}