Cod sursa(job #2122364)

Utilizator valorosu_300Cristian Gherman valorosu_300 Data 4 februarie 2018 22:41:41
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int N = 1003, M = 1999999999;
int cap[N][N], fl[N][N];
short int c[N], pred[N], n;
bool viz[N];
vector <short int> v[N];
bool BFS(int ns, int sink){
    int st = 1, dr = 1, nod, sz, nbr;
    viz[ns] = true;
    c[1] = ns;
    for(int i=1;i<=n;i++)
        viz[i] = false;
    while(st <= dr){
        nod = c[st++];
        if(nod == sink)
            continue;
        sz = v[nod].size();
        for(int i=0;i<sz;i++){
            nbr = v[nod][i];
            if(cap[nod][nbr] == fl[nod][nbr] || viz[nbr] == true)
                continue;
            viz[nbr] = true;
            c[++dr] = nbr;
            pred[nbr] = nod;
        }
    }
    return viz[sink];
}
int main()
{
    int m,x,y,z, flow = 0, ns = 1, sink, nod, crt, sz;
    in>>n>>m;
    sink = n;
    for(int i=1;i<=m;i++){
        in>>x>>y>>z;
        v[x].push_back(y);
        v[y].push_back(x);
        cap[x][y] = z;
    }
    in.close();
    while(BFS(ns,sink) == true){
        sz = v[sink].size();
        for(int i=0;i<sz;i++){
            nod = v[sink][i];
            if(cap[nod][sink] == fl[nod][sink] || viz[nod] == false)
                continue;
            pred[sink] = nod;
            crt = M;
            nod = sink;
            while(nod != ns){
                crt = min(crt, cap[pred[nod]][nod] - fl[pred[nod]][nod]);
                nod = pred[nod];
            }
            if(crt == 0)
                continue;
            nod = sink;
            while(nod != ns){
                fl[pred[nod]][nod] += crt;
                fl[nod][pred[nod]] -= crt;
                nod = pred[nod];
            }
            flow += crt;
        }
    }
    out<<flow<<"\n";
    out.close();
    return 0;
}