Cod sursa(job #2164585)

Utilizator albucristianAlbu Cristian-Gabriel albucristian Data 13 martie 2018 08:29:22
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
int ma[1002][1002];
int gri[1002],gre[1002],viz[1002],tata[1002],drum[1002];
int n,m,a,b,c,q,w,sol,mi,cop,ok,no,k;
queue <int> coada;
void bfs()
{
    while(!coada.empty())
    {
        no=coada.front();
        coada.pop();
        viz[no]=1;
        for(int i=1;i<=n;i++)
        {
            if(ma[no][i]>0&&!viz[i])
            {
                tata[i]=no;
                if(i==n)
                {
                    viz[n]=1;
                    return;
                }
                coada.push(i);
            }
        }
    }
}
void construire_drum()
{
    k=0;
    cop=n;
    mi=0;
    while(tata[cop])
    {
        if(mi==0||ma[tata[cop]][cop]<mi)
        {
            mi=ma[tata[cop]][cop];
        }
        drum[++k]=cop;
        cop=tata[cop];
    }
    drum[++k]=1;
}
int main()
{
    ifstream in("maxflow.in");
    ofstream out("maxflow.out");
    in>>n>>m;
    for(int i=1;i<=m;i++)
    {
        in>>a>>b>>c;
        ma[a][b]=c;
        gri[b]++;
        gre[a]++;
    }
    sol=0;
    ok=1;
    coada.push(1);
    bfs();
    while(viz[n])
    {
        construire_drum();
        sol+=mi;
        for(int i=1;i<k;i++)
        {
            ma[drum[i+1]][drum[i]]-=mi;
        }
        for(int i=1;i<=n;i++)
        {
            viz[i]=0;
        }
        while(!coada.empty())
        {
            coada.pop();
        }
        coada.push(1);
        bfs();
    }
    out<<sol;
    return 0;
}