Cod sursa(job #88150)

Utilizator sealTudose Vlad seal Data 30 septembrie 2007 15:25:40
Problema Algola Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include<stdio.h>
#define Nm 51
#define Mm 300
#define Nodem (Nm*100)
#define min(a,b) ((a)<(b)?(a):(b))
int G[Nodem][Nm],P[Nodem][Nm],F[Nodem][Nm],C[Nodem][Nm];
int D[Nodem],Q[Nodem],Min[Nodem],Pren[Nodem],Prep[Nodem];
int X[Mm],Y[Mm],L[Mm],A[Nm],n,m,a,node,sink;

void read()
{
    int i;

    freopen("algola.in","r",stdin);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
    {
        scanf("%d",A+i);
        a+=A[i];
    }
    for(i=0;i<m;++i)
        scanf("%d%d%d",X+i,Y+i,L+i);
}

void insert(int x, int y, int c)
{
    F[x][D[x]]=F[y][D[y]]=0;
    P[x][D[x]]=D[y];
    P[y][D[y]]=D[x];
    G[x][D[x]]=y;
    G[y][D[y]]=x;
    C[x][D[x]++]=c;
    C[y][D[y]++]=0;
}

int BFS()
{
    int l,r,i,x,y;

    Q[l=r=0]=0; Min[0]=a; Pren[0]=-2;
    for(i=1;i<node;++i)
        Pren[i]=-1;

    while(l<=r && Pren[sink]==-1)
    {
        x=Q[l++];
        for(i=0;i<D[x];++i)
        {
            y=G[x][i];
            if(Pren[y]==-1 && F[x][i]<C[x][i])
            {
                Pren[y]=x; Prep[y]=i;
                Min[y]=min(Min[x],C[x][i]-F[x][i]);
                Q[++r]=y;
            }
        }
    }

    return Pren[sink]!=-1;
}

int solve()
{
    int i,j,flow=0;

    node=n+1; sink=1;
    for(j=1;j<=n;++j)
        insert(0,j,A[j]);

    for(i=0;;++i)
    {
        while(BFS())
        {
            flow+=Min[sink];
            j=sink;
            while(j)
            {
                F[Pren[j]][Prep[j]]+=Min[sink];
                F[j][P[Pren[j]][Prep[j]]]-=Min[sink];
                j=Pren[j];
            }
        }

        if(flow==a)
            return i;

        node+=n; sink+=n;
        for(j=0;j<m;++j)
        {
            insert(i*n+X[j],(i+1)*n+Y[j],L[j]);
            insert(i*n+Y[j],(i+1)*n+X[j],L[j]);
        }
        for(j=1;j<=n;++j)
            insert(i*n+j,(i+1)*n+j,a);
    }
}

void write(int ans)
{
    freopen("algola.out","w",stdout);
    printf("%d\n",ans);
}

int main()
{
    read();
    write(solve());
    return 0;
}