Cod sursa(job #2130404)

Utilizator MaaaaaCristina Ma Maaaaa Data 13 februarie 2018 17:52:55
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <string.h>
#include <stdlib.h>
#include <vector>
#define nmax 1005
#define cmax 110005
using namespace std;
fstream f1("maxflow.in", ios::in);
fstream f2("maxflow.out", ios::out);
int n, m, cap[nmax][nmax], flux[nmax][nmax], S, D, prim, ultim, k, coada[nmax], viz[nmax], l[nmax];
long long fmax;
vector<int> v[nmax];
//Edmond-Karp
void citire()
{
    int i, x, y, c;
    f1>>n>>m;
    S=1; D=n;
    for(i=1; i<=m; i++)
    {
        f1>>x>>y>>c;
        cap[x][y]=c;
        cap[y][x]=-c;//simetrie
        v[x].push_back(y);
        v[y].push_back(x);//poti merge si pe muchiile inverse
    }
}
int bfs()
{
    int nod;
    memset(viz, 0, sizeof(viz));
    memset(l, 0, sizeof(l));
    prim=ultim=k=1;
    coada[ultim]=S;
    viz[S]=1;
    while(k!=0)
    {
        nod=coada[prim];
        prim++; k--;
        for(auto it=v[nod].begin(); it!=v[nod].end(); ++it)
            if((!viz[*it])&&(cap[nod][*it]-flux[nod][*it]>0))
        {
            viz[*it]=1;
            ultim++;k++;
            coada[ultim]=*it;
            l[*it]=nod;
        }
    }
    return l[D];
}
void amelioreaza_drum()
{
    int i, mini=cmax;
    for(i=D; i!=S; i=l[i])
        if(mini> cap[l[i]][i]-flux[l[i]][i])
         mini=cap[l[i]][i]-flux[l[i]][i];
    for(i=D; i!=S; i=l[i])
    {
        flux[l[i]][i]+=mini;
        flux[i][l[i]]-=mini;
    }
    fmax+=mini;
}
int main()
{
    citire();
    while(bfs()) ///cat timp exista drum de ameliorare
    amelioreaza_drum();
    f2<<fmax;
    return 0;
}