Cod sursa(job #68310)

Utilizator vlad_popaVlad Popa vlad_popa Data 27 iunie 2007 15:33:06
Problema Sate Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
using namespace std;

#include <cstdio>
#include <cassert>
#include <vector>

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

vector <int> A[NMAX], Dist[NMAX];
int N, M, X, Y, D[NMAX], ended, cd[NMAX<<1];

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

    int a, b, d;
    for (int i = 1; i <= M; ++ i)
    {
        scanf ("%d %d %d\n", &a, &b, &d);
        A[a].pb (b);
        A[b].pb (a);
        Dist[a].pb (d);
        Dist[b].pb (d);
    }
}

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

    for (int pas = 0; pas <= ended; ++ pas)
    {
        v = cd[pas];
        sz = A[v].size ();
        
        for (i = 0; i < sz; ++ i)
            if (!D[A[v][i]])
            {
                if (A[v][i] < v)
                    D[A[v][i]] = D[v] - Dist[v][i];
                else
                    D[A[v][i]] = D[v] + Dist[v][i];
                fprintf (stderr, "%d   %d\n", A[v][i], D[A[v][i]]);
                cd[++ ended] = A[v][i];
                if (A[v][i] == Y)
                    return;
            }
    }
}

void solve ()
{
    bf ();

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

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

    read ();
    solve ();

    return 0;
}