Cod sursa(job #2179350)

Utilizator Marcel.DragosMarcel Dragos Ignat Marcel.Dragos Data 20 martie 2018 10:05:52
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
using namespace std;
int n,m,i,viz[1002],prim,ultim,coada[1002],nod,C[1002][1002],F[1002][1002],t[1002],x,y,c,j,minim,flux;

int bf()
{
    for(i=1; i<=n; i++)
        viz[i]=0;
    prim=1; ultim=1;
    coada[1]=1;
    while(prim<=ultim)
    {
        nod=coada[prim++];
        for(i=1; i<=n; i++)
            if(C[nod][i]-F[nod][i]>0 && viz[i]==0)
            {
                viz[i]=1;
                t[i]=nod;
                coada[++ultim]=i;
            }
    }
    return viz[n];
}

int main()
{
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(i=1; i<=m; i++)
    {
        scanf("%d%d%d", &x, &y, &c);
        C[x][y]=c;
    }
    while(bf())
    {
        for(j=1; j<=n; j++)
            if(C[j][n]-F[j][n]>0)
        {
            minim=C[j][n]-F[j][n];
            for(i=j; i!=1; i=t[i])
                if(C[t[i]][i]-F[t[i]][i]<minim)
                    minim=C[t[i]][i]-F[t[i]][i];
            for(i=j; i!=1; i=t[i])
            {
                F[t[i]][i]+=minim;
                F[i][t[i]]-=minim;
            }
            F[j][n]+=minim;
            F[n][j]-=minim;
            flux+=minim;
        }
    }
    printf("%d", flux);


    return 0;
}