Cod sursa(job #92800)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 16 octombrie 2007 18:26:26
Problema Sate Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <cstdio>
#include <vector>

using namespace std;

#define INF 666000666
#define NMAX 30030
#define QMAX ((1<<18)-1)
#define pb push_back
#define f(x) (x=(x+1)&QMAX)

vector<int> A[NMAX], C[NMAX];
int N, M, X, Y, hi, Dist[NMAX], Q[QMAX+10], G[NMAX];

void read()
{
        int d, i, j, k;
        freopen("sate.in", "r", stdin);
        scanf("%d%d%d%d", &N, &M, &X, &Y);
        for (k = 0; k < M; k++)
        {
                scanf("%d%d%d", &i, &j, &d);
                A[i].pb(j); A[j].pb(i); C[i].pb(d); C[j].pb(d);
                G[i]++; G[j]++;
                if (i==X) { Q[hi] = j; f(hi); }
                if (j==X) { Q[hi] = i; f(hi); }
        }
}

void solve()
{
        int i, j, d, f, lo, n;

        for (i = 0; i < NMAX; i++) Dist[i] = INF;
        Dist[X] = 0;
        for (n = A[X].size(), i = 0; i < n; i++)
            Dist[ A[X][i] ] = C[X][i];

        if (Dist[Y]<INF) { printf("%d\n", Dist[Y]); exit(0); }

        freopen("sate.out", "w", stdout);

        for (lo = 0; lo < hi; f(lo))
        {
                i = Q[lo];
                for (n = G[i], j = 0; j < n; j++)
                {
                        f = A[i][j]; d = C[i][j];
                        if (Dist[f]==INF)
                        {
                                //case 1
                                   if ( (X < i && i < f) || (X > i && i > f) ) Dist[f] = Dist[i]+d;
                                   else
                                //case 2
                                   if ( (X < f && f < i) || (X > f && f > i) ) Dist[f] = Dist[i]-d;
                                   else
                                //case 3
                                   if ( (f < X && X < i) || (i < X && X < f) ) Dist[f] = d-Dist[i];

                                Q[hi] = f; f(hi);

                                if (f==Y)
                                   { printf("%d\n", Dist[f]); exit(0); }
                        }
                }
        }
}

int main()
{
        read();
        solve();
        return 0;
}