Cod sursa(job #68321)

Utilizator vlad_popaVlad Popa vlad_popa Data 27 iunie 2007 16:02:57
Problema Sate Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 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

vector <int> A[NMAX], Dist[NMAX];
int N, M, X, Y, D[NMAX], ended, cd[NMAX<<1], a, b, d;
char s[1<<8];

void get ()
{
    a = b = d = 0;

    int len = strlen (s), ct, i = len - 2;

    ct = 1;
    while (s[i] != ' ')
    {
        d += ct * (s[i] - '0');
        ct *= 10;
        -- i;
    }
    -- i;

    ct = 1;
    while (s[i] != ' ')
    {
        b += ct * (s[i] - '0');
        ct *= 10;
        -- i;
    }
    -- i;

    ct = 1;
    while (i >= 0)
    {
        a += ct * (s[i] - '0');
        ct *= 10;
        -- i;
    }
}

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

    for (int i = 1; i <= M; ++ i)
    {
        fgets (s, 100, stdin);
        get ();
        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;
}