Cod sursa(job #2166179)

Utilizator albucristianAlbu Cristian-Gabriel albucristian Data 13 martie 2018 15:55:59
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 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()
{
    viz.reset();
    queue <int> coada;
    coada.push(1);
    while(!coada.empty())
    {
        no=coada.front();
        coada.pop();
        if(no==n)
            return 1;
        viz[no]=1;
        for(int i=0;i<graf[no].size();i++)
        {
            if(ma[no][graf[no][i]]&&!viz[graf[no][i]])
            {
                tata[graf[no][i]]=no;
                viz[graf[no][i]]=1;
                if(graf[no][i]==n)
                {
                    return 1;
                }
                coada.push(graf[no][i]);
            }
        }
    }
    return 0;
}
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;
        graf[a].push_back(b);
        ma[a][b]=c;
        gri[b]++;
        gre[a]++;
    }
    sol=0;
    ok=1;
    while(bfs())
    {
        construire_drum();
        sol+=mi;
        for(int i=1;i<k;i++)
        {
            ma[drum[i+1]][drum[i]]-=mi;
        }
    }
    out<<sol;
    return 0;
}