Cod sursa(job #2029956)

Utilizator zhm248Mustatea Radu zhm248 Data 30 septembrie 2017 18:26:59
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include<cstdio>
using namespace std;
const int inf=200000;
int g[1001][1001];
int pi[1001],cn[1001],d[1001],q[1001],num[1001],n;
void bfs()
{
    int i,j,st=0,dr=0;
    for(i=1; i<=n; ++i)
    {
        d[i]=n;
        num[n]++;
    }
    num[n]--;
    d[n]=0;
    num[0]++;
    q[++dr]=n;
    while(st!=dr)
    {
        i=q[++st];
        for(j=1; j<=n; ++j)
        {
            if(d[j]==n&&g[j][i])
            {
                q[++dr]=j;
                num[n]--;
                d[j]=d[i]+1;
                num[d[j]]++;
            }
        }
    }
}

int marire()
{
    int i=n,minim=inf;
    while(i!=1)
    {
        if(g[pi[i]][i]<minim)
            minim=g[pi[i]][i];
        i=pi[i];
    }
    i=n;
    while(i!=1)
    {
        g[pi[i]][i]-=minim;
        g[i][pi[i]]+=minim;
        i=pi[i];
    }
    return minim;
}


int ret(int &i)
{
    int t,j,minim=n-1;
    for(j=1; j<=n; ++j)
    {
        if(g[i][j]>0&&d[j]<minim)
            minim=d[j];
    }
    t=d[i];
    num[d[i]]--;
    d[i]=1+minim;
    num[d[i]]++;
    if(i!=1)
        i=pi[i];
    return num[t];
}

int maxf()
{
    int f=0,i,j;
    bfs();
    for(i=1; i<=n; ++i)
    {
        cn[i]=1;
    }
    i=1;
    while(d[1]<n)
    {
        for(j=cn[i]; j<=n; ++j)
        {
            if(g[i][j]>0&&d[i]==d[j]+1)
                break;
        }
        if(j<=n)
        {
            cn[i]=j;
            pi[j]=i;
            i=j;
            if(i==n)
            {
                f+=marire();
                i=1;
            }
        }
        else
        {
            cn[i]=1;
            if(!ret(i))
                break;
        }
    }
    return f;
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int m,i,x,y,c;
    scanf("%d%d",&n,&m);
    for(i=1; i<=m; ++i)
    {
        scanf("%d%d%d",&x,&y,&c);
        g[x][y]+=c;
    }
    printf("%d\n",maxf());
    return 0;
}