Cod sursa(job #2168118)

Utilizator GeorgeCalinPetruta George-Calin GeorgeCalin Data 14 martie 2018 09:38:42
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#include <vector>
#include <queue>
#define nmax 1002
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int c[nmax][nmax],f[nmax][nmax],viz[nmax],oto[nmax],x,y,val,n,m,flux;
vector <int> graf[nmax];
queue <int> coada;

int bfs()
{
    for(int i=1;i<=n;i++)
        viz[i]=0;
    coada.push(1);
    viz[1]=1;
    while(!coada.empty())
    {
        int nod=coada.front();
        coada.pop();
        if(nod==n)
            continue;
        for(int i=0;i<graf[nod].size();i++)
        {
            int v=graf[nod][i];
            if(c[nod][v]==f[nod][v]||viz[v])
                continue;
            oto[v]=nod;
            viz[v]=1;
            coada.push(v);
        }
    }
    return viz[n];
}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y>>val;
        c[x][y]=val;
        graf[x].push_back(y);
        graf[y].push_back(x);
    }
    while(bfs())
    {
        for(int i=0;i<graf[n].size();i++)
        {
            int v=graf[n][i];
            if(c[v][n]==f[v][n]||!viz[v])
                continue;
            oto[n]=v;
            int nod=n;
            int mini=1000002;
            while(nod!=1)
            {
                mini=min(mini,c[oto[nod]][nod]-f[oto[nod]][nod]);
                nod=oto[nod];
            }
            if(mini==0)
                continue;
            nod=n;
            flux+=mini;
            while(nod!=1)
            {
                f[oto[nod]][nod]+=mini;
                f[nod][oto[nod]]-=mini;
                nod=oto[nod];
            }
        }
    }
    fout<<flux;
    return 0;
}