Cod sursa(job #2166249)

Utilizator albucristianAlbu Cristian-Gabriel albucristian Data 13 martie 2018 16:17:16
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
int ma[1002][1002];
int gri[1002],gre[1002],tata[1002],drum[1002];
int n,m,a,b,c,q,w,sol,mi,cop,ok,no,k;
vector <int> graf[1002];
bitset <1002> viz;
int bfs()
{
    ok=0;
    viz.reset();
    queue <int> coada;
    coada.push(1);
    while(!coada.empty())
    {
        no=coada.front();
        coada.pop();
        viz[no]=1;
        for(int i=0;i<graf[no].size();i++)
        {
            if(graf[no][i]!=n)
            {
                if(ma[no][graf[no][i]]&&!viz[graf[no][i]])
                {
                    tata[graf[no][i]]=no;
                    viz[graf[no][i]]=1;
                    coada.push(graf[no][i]);
                }
            }
            else
            {
                ok=1;
            }
        }
    }
    return ok;
}
void construire_drum(int x)
{
    k=0;
    cop=x;
    while(tata[cop])
    {
        if(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;
        graf[a].push_back(b);
        if(b==n)
            graf[b].push_back(a);
        ma[a][b]=c;
        gri[b]++;
        gre[a]++;
    }
    sol=0;
    ok=1;
    while(bfs())
    {
        for(int i=0;i<graf[n].size();i++)
        {
            if(tata[graf[n][i]])
            {
                mi=ma[graf[n][i]][n];
                construire_drum(graf[n][i]);
                sol+=mi;
                for(int i=1;i<k;i++)
                {
                    ma[drum[i+1]][drum[i]]-=mi;
                }
            }
        }
    }
    out<<sol;
    return 0;
}