Cod sursa(job #1262792)

Utilizator ionutpop118Pop Ioan Cristian ionutpop118 Data 13 noiembrie 2014 16:01:34
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int c[1005][1005],f[1005][1005],viz[1005],pred[1005],n;
queue <int> q;
bool BFS(int nod)
{
    int aux;
    viz[nod]=1;
    while (!q.empty())
        q.pop();
    q.push(nod);
    while (!q.empty())
    {
        aux=q.front();
        if (aux==n)
            return 1;
        for (register int i=1;i<=n;++i)
        {
            if (c[aux][i]-f[aux][i]>0&&viz[i]==0)
            {
                viz[i]=1;
                pred[i]=aux;
                q.push(i);
            }
        }
        q.pop();
    }
}
int main()
{
    int m,x,y,cap,fmin,fmax=0;
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (register int i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&cap);
        c[x][y]=c[y][x]=cap;
    }
    fmax=0;
    while(BFS(1))
    {
        //avem drum
        fmin=(1LL<<31)-1;
        for (register int i=n;i!=1;i=pred[i])
            fmin=min(fmin,c[pred[i]][i]-f[pred[i]][i]);
        fmax+=fmin;
        for (register int i=n;i!=1;i=pred[i])
        {
            f[pred[i]][i]+=fmin;
            f[i][pred[i]]-=fmin;
        }
        memset(viz,0,sizeof(viz));
    }
    printf("%d",fmax);
    return 0;
}