Cod sursa(job #2166669)

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

queue <int> coada;
vector <int> graf[nmax];

int viz[nmax],c[nmax][nmax],oto[nmax],f[nmax][nmax],flux=0,n,m,x,y,val;

int bfs()
{
    while(!coada.empty())
        coada.pop();
    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();
        int lg=graf[nod].size();
        if(nod==n)
            continue;
        for(int i=0;i<lg;i++)
        {
            if(c[nod][graf[nod][i]]==f[nod][graf[nod][i]]||viz[graf[nod][i]])
                continue;
            viz[graf[nod][i]]=1;
            oto[graf[nod][i]]=nod;
            coada.push(graf[nod][i]);
        }
    }
    return viz[n];
}

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