Cod sursa(job #2495473)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 19 noiembrie 2019 15:02:59
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <bits/stdc++.h>
#define DIM 1010
#define INF 2000000000
using namespace std;

ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
vector <int> L[DIM],edges[DIM];
deque <int> c;
int capacitate[DIM][DIM],dist[DIM],st[DIM];
int n,m,x,y,C,i,sursa,dest;
void bfs (int sursa, int dest){
    for (int i=sursa;i<=dest;i++){
       // edges[i].clear();
        dist[i] = INF;
    }
    c.clear();
    c.push_back(sursa);
    dist[sursa] = 0;
    while (!c.empty()){
        int nod = c.front();
        c.pop_front();
        if (nod == dest)
            break;
        for (int i=0;i<L[nod].size();i++){
            int vecin = L[nod][i];
            if (!capacitate[nod][vecin])
                continue;
            if (dist[vecin] == INF){
                dist[vecin] = 1+dist[nod];
                c.push_back(vecin);
            }
            //if (dist[vecin] == 1+dist[nod])
              //  edges[nod].push_back(vecin); /// level graph
        }}}
int dfs (int nod, int dest, int max_flow){
    if (nod == dest || !max_flow)
        return max_flow;
    int flow = 0;
    for (;st[nod]<L[nod].size();st[nod]++){
        int vecin = L[nod][st[nod]];
        if (!capacitate[nod][vecin] || dist[vecin] != dist[nod]+1)
            continue;
        int val = dfs (vecin,dest,min(capacitate[nod][vecin],max_flow-flow));
        flow += val;
        capacitate[nod][vecin] -= val;
        capacitate[vecin][nod] += val;
    }
    return flow;
}
int main (){

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

    } while (flux);

    fout<<sol;



    return 0;
}