Cod sursa(job #2209047)

Utilizator lucaperjuLuca Perju Verzotti lucaperju Data 1 iunie 2018 16:34:14
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
using namespace std;
ifstream in ("maxflow.in");
ofstream out ("maxflow.out");
//vector <int> v[1005];
int n,m,pred[1005],c[1002][1002],f[1002][1002],q[1002],viz[1002];
void reset_viz()
{
    for(int i=1;i<=n;++i)
        viz[i]=0;
}
void citire ()
{
    int i,a,b,cc;
    in>>n>>m;
    for(i=1;i<=m;++i)
    {
        in>>a>>b>>cc;
   //     v[a].push_back(b);
        c[a][b]=cc;
    }
}
bool bfs ()
{
    int st=0,dr=-1,x,y;
    reset_viz();
    q[++dr]=1;
    while(st<=dr)
    {
        x=q[st++];
        viz[x]=1;
        for(y=1;y<=n;++y)
            if(!viz[y] && c[x][y]>f[x][y])
            {
                q[++dr]=y;
                pred[y]=x;
                if(y==n)
                    return true;
            }
    }
    return false;
}
int min_drum()
{
    int x=n,vmin=99999999;
    while(x!=1)
    {
        vmin=min(vmin,c[pred[x]][x]-f[pred[x]][x]);
        x=pred[x];
    }
    return vmin;
}
void actualizare_drum(int vmin)
{
    int x=n;
    while(x!=1)
    {
        f[pred[x]][x]+=vmin;
        f[x][pred[x]]-=vmin;
        x=pred[x];
    }
}
int main()
{
    int vmin,s=0;
    citire();
    while(bfs())
    {
        vmin=min_drum();
        s+=vmin;
        actualizare_drum(vmin);
    }
    out<<s;
    return 0;
}