Cod sursa(job #68410)

Utilizator dominoMircea Pasoi domino Data 27 iunie 2007 19:51:03
Problema Sate Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <stdio.h>
#include <algorithm>
#include <vector>

using namespace std;

#define MAX_N 30005
#define MAX_M 200050
#define FIN "sate.in"
#define FOUT "sate.out"
#define pb push_back
#define mp make_pair
#define f first
#define s second

int N, M, X, Y, D[MAX_N], Q[MAX_M], inq[MAX_N];
vector< pair<short, int> > G[MAX_N];
char buf[128], *p;

inline int get(void)
{
    int n = 0;

    for (; *p >= '0' && *p <= '9'; p++)
        n = n*10 + *p-'0';
    for (; *p == ' '; p++);
    return n;
}

int main(void)
{
    int i, a, b, c, n, ql, qr;
    vector< pair<short, int> >::iterator it;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d %d %d %d\n", &N, &M, &X, &Y);
    for (i = 0; i < M; i++)
    {
        fgets(buf, sizeof(buf), stdin);
        p = buf; a = get(); b = get(); c = get();
        G[a].pb(mp(b, c));
        G[b].pb(mp(a, -c));
    }

    ql = 0, qr = -1;
    for (i = 1; i <= N; i++) inq[Q[++qr] = i] = 1;
    for (; ql <= qr; ql++)
    {
        for (it = G[n = Q[ql]].begin(); it != G[n].end(); it++)
            if (D[it->f] > D[n]+it->s)
            {
                D[it->f] = D[n]+it->s;
                if (!inq[it->f]) Q[++qr] = it->f;
            }
        inq[n] = 0;
    }

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

    return 0;
}