Cod sursa(job #328196)

Utilizator jupanubv92Popescu Marius jupanubv92 Data 1 iulie 2009 12:21:53
Problema Sate Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<stdio.h>
#define Nmx 100010

int X,Y,n,m;
int nr[Nmx],dis[Nmx];
int qu[1000001];

struct nod
{
    int dist;
    int inf;
    nod *urm;
};

nod *G[Nmx];

void insert(int x,int y,int dis)
{
    nod *aux;
    aux = new nod;
    aux -> urm = G[x];
    aux -> inf = y;
    aux -> dist = dis;
    G[x]=aux;
}

void citire()
{
    scanf("%d%d%d%d",&n,&m,&X,&Y);
    int x,y,d;
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&x,&y,&d);
        insert(x,y,d);
        insert(y,x,d);
    }
}

int bfs()
{
    int st=1,dr=1;

    qu[1]=X;
    nr[X]=1;

    while(st<=dr)
    {
        for(nod *p=G[qu[st]];p!=NULL;p=p->urm)
        {
            if(!nr[p->inf])
            {
                nr[p->inf]=nr[qu[st]]+1;
                if(p->inf>qu[st])
                  dis[p->inf]=dis[qu[st]]+p->dist;
                 else if(p->inf<X) dis[p->inf]=p->dist-dis[qu[st]];
                        else  dis[p->inf]=dis[qu[st]]-p->dist;
                qu[++dr]=p->inf;
                if(p->inf==Y) return dis[Y];
            }
        }
        ++st;
    }
    return -1;
}


int main()
{
    freopen("sate.in","r",stdin);
    freopen("sate.out","w",stdout);

    citire();

    printf("%d\n",bfs());

    return 0;
}