Cod sursa(job #68326)

Utilizator vlad_popaVlad Popa vlad_popa Data 27 iunie 2007 16:16:56
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
using namespace std;

#include <cstdio>
#include <cassert>
#include <vector>
#include <string.h>

#define FIN "sate.in"
#define FOUT "sate.out"
#define NMAX 1<<15
#define INF 0x3f3f3f3f
#define pb push_back

int N, M, X, Y, D[NMAX], ended, cd[NMAX<<1], a, b, d;

struct graf
{
    int n, v;
    graf *next;
}   *A[NMAX];

void add (int x, int y, int z)
{
    graf *p = new graf;
    p -> n = y;
    p -> v = z;
    p -> next = A[x];
    A[x] = p;
}

void read ()
{
    scanf ("%d %d %d %d\n", &N, &M, &X, &Y);

    for (int i = 1; i <= M; ++ i)
    {
        scanf ("%d %d %d\n", &a, &b, &d);
        add (a, b, d);
        add (b, a, d);
    }
}

void bf ()
{
    int v, sz, i;
    cd[ended = 0] = X;
    D[X] = 1;

    for (int pas = 0; pas <= ended; ++ pas)
    {
        v = cd[pas];

        if (v == Y)
            return;
        for (graf *p = A[v]; p; p = p -> next)
            if (!D[p -> n])
            {
                if (p -> n < v)
                    D[p -> n] = D[v] - (p -> v);
                else
                    D[p -> n] = D[v] + (p -> v);
                //fprintf (stderr, "%d   %d\n", A[v][i], D[A[v][i]]);
                cd[++ ended] = p -> n;
            }
    }
}

void solve ()
{
    bf ();

    printf ("%d\n", D[Y] - 1);
}

int
 main ()
{
    freopen (FIN, "rt", stdin);
    freopen (FOUT, "wt", stdout);

    read ();
    solve ();

    return 0;
}