Cod sursa(job #73984)

Utilizator astronomyAirinei Adrian astronomy Data 23 iulie 2007 11:41:42
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <vector>
using namespace std;

#define MAX_N 30100
#define pb push_back

int N, M, X, Y, Q[MAX_N], D[MAX_N], viz[MAX_N];
vector<short> G[MAX_N];
vector<int> R[MAX_N];

void solve(void)
{
    int inc, sf, i, y, x;
    vector<short>::iterator it;
    vector<int>::iterator it2;
    
    Q[inc = sf = 0] = X, viz[X] = 1;

    while(inc <= sf)
    {
        x = Q[inc++];
        for(it = G[x].begin(), it2 = R[x].begin(); it != G[x].end(); ++it,
        ++it2)
        {
            if(!viz[*it])
                viz[*it] = 1, Q[++sf] = *it,
                D[*it] = D[x] + (*it2)*(x<(*it)?1:-1);
        }
    }
}

void read_data(void)
{
    int i, a, b, c, ind;
    char sir[256];

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

    for(i = 1; i <= M; i++)
    {
        fgets(sir, 256, stdin), ind = a = b = c = 0;
        for(; sir[ind] >= '0' && sir[ind] <= '9'; ind++)
            a = a*10+(sir[ind]-48);
        for(ind++; sir[ind] >= '0' && sir[ind] <= '9'; ind++)
            b = b*10+(sir[ind]-48);
        for(ind++; sir[ind] >= '0' && sir[ind] <= '9'; ind++)
            c = c*10+(sir[ind]-48);
        G[a].pb(b), G[b].pb(a), R[a].pb(c), R[b].pb(c);
    }
}

void write_data(void)
{
    printf("%d\n", D[Y]);
}

int main(void)
{
    freopen("sate.in", "rt", stdin);
    freopen("sate.out", "wt", stdout);

    read_data();
    solve();
    write_data();

    return 0;
}