Cod sursa(job #67893)

Utilizator sealTudose Vlad seal Data 25 iunie 2007 20:26:28
Problema Sate Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<stdio.h>
#include<stdlib.h>
#define Nm 30001
#define Unvizited 1000000000
#define abs(x) ((x)<0?-(x):(x))
int *G[Nm],*C[Nm],D[Nm],Dx[Nm],Dy[Nm],n,x,y;

void read()
{
    int m,i,j,k;

    freopen("sate.in","r",stdin);
    scanf("%d%d%d%d",&n,&m,&x,&y);
    while(m--)
    {
        scanf("%d%d%d",&i,&j,&k);
        G[i]=(int*)realloc(G[i],(D[i]+1)*sizeof(int));
        C[i]=(int*)realloc(C[i],(D[i]+1)*sizeof(int));
        G[i][D[i]]=j;
        C[i][D[i]++]=k;

        G[j]=(int*)realloc(G[j],(D[j]+1)*sizeof(int));
        C[j]=(int*)realloc(C[j],(D[j]+1)*sizeof(int));
        G[j][D[j]]=i;
        C[j][D[j]++]=-k;
    }
}

void DFSx(int x)
{
    int i,y;

    for(i=0;i<D[x];++i)
    {
        y=G[x][i];
        if(Dx[y]==Unvizited)
        {
            Dx[y]=Dx[x]+C[x][i];
            DFSx(y);
        }
    }
}

void DFSy(int x)
{
    int i,y;

    for(i=0;i<D[x];++i)
    {
        y=G[x][i];
        if(Dy[y]==Unvizited)
        {
            Dy[y]=Dy[x]+C[x][i];
            DFSy(y);
        }
    }
}


int solve()
{
    int i;

    for(i=1;i<=n;++i)
        Dx[i]=Dy[i]=Unvizited;

    Dx[x]=0; DFSx(x);
    Dy[y]=0; DFSy(y);

    for(i=1;i<=n;++i)
        if(Dx[i]!=Unvizited && Dy[i]!=Unvizited)
            return abs(abs(Dx[i])-abs(Dy[i]));
}

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

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