Cod sursa(job #92809)

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

using namespace std;

#define INF 666000666
#define NMAX 30030
#define pb push_back

vector<int> A[NMAX], C[NMAX];
int N, M, X, Y, hi, Dist[NMAX], Q[NMAX], G[NMAX], F[NMAX];
char buf[2500000];
FILE *f;

void read()
{
        int d, i, j, k;
        f=fopen("sate.in", "r");
        setbuffer(f,buf,sizeof(buf));
        fscanf(f,"%d%d%d%d", &N, &M, &X, &Y);
        for (k = 0; k < M; k++)
        {
                fscanf(f,"%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; hi++; }
                if (j==X) { Q[hi] = i; hi++; }
        }
        fclose(f);
}

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];

        freopen("sate.out", "w", stdout);
        if (Dist[Y]<INF) { printf("%d\n", Dist[Y]); exit(0); }

        F[X] = 1;
        for (lo = 0; lo < hi; lo++)
        {
                i = Q[lo];
                for (n = G[i], j = 0; j < n; j++)
                {
                        f = A[i][j]; d = C[i][j];
                        if (!F[f])
                        {
                                //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; hi++;

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

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