Cod sursa(job #67895)

Utilizator sealTudose Vlad seal Data 25 iunie 2007 20:43:31
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Nm 30001
#define Mm 100024
#define Unvizited 1000000000
#define abs(x) ((x)<0?-(x):(x))
int D[Nm],Dx[Nm],Dy[Nm],X[Mm],Y[Mm],C[Mm],n,m,x,y;
struct edge
{
    int x,c;
} *G[Nm];

void read()
{
    char S[18];
    int i;

    freopen("sate.in","r",stdin);
    scanf("%d%d%d%d\n",&n,&m,&x,&y);
    for(i=0;i<m;++i)
    {
        gets(S);
        X[i]=atoi(strtok(S," "));
        Y[i]=atoi(strtok(NULL," "));
        C[i]=atoi(strtok(NULL," "));
    }
}

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

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

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

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


int solve()
{
    int i;

    for(i=0;i<m;++i)
    {
        ++D[X[i]];
        ++D[Y[i]];
    }
    for(i=1;i<=n;++i)
    {
        G[i]=(edge*)malloc(D[i]*sizeof(edge));
        D[i]=0;
    }
    for(i=0;i<m;++i)
    {
        G[X[i]][D[X[i]]].x=Y[i];
        G[X[i]][D[X[i]]++].c=C[i];
        G[Y[i]][D[Y[i]]].x=X[i];
        G[Y[i]][D[Y[i]]++].c=-C[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;
}