Cod sursa(job #2166529)

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