Cod sursa(job #2168144)

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