Cod sursa(job #67527)

Utilizator sandyxpSanduleac Dan sandyxp Data 25 iunie 2007 11:15:51
Problema Sate Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda Finala, Clasa a 10-a Marime 1.23 kb
#include <stdio.h>
#include <stdlib.h>

#define FIN "sate.in"
#define FOUT "sate.out"
#define MAXN 30001

int n, m, x, y;

struct elem { int x, c; elem *r; } * L[MAXN];

void push(int a, int b, int c)
{
    elem *temp = new elem;
    temp->x = b; temp->c = c; temp->r = L[a];
    L[a] = temp;
}

void citire()
{
    int i, a, b, c;
    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);
    scanf("%d%d%d%d", &n, &m, &x, &y);
    for (i=0; i<m; ++i) {
        scanf("%d %d %d", &a, &b, &c);
        push(a, b, c);
        push(b, a, -c);
    }
}

long long dist = 0;
int prev;

void fixme(int s)
{
    if (s == y/* || -s == y+1*/) {
        printf("%lld\n", dist); exit(0);
    }
    //if (s<0) s = -s;
    for (elem *p = L[s], *last=0; p; last = p, p = p->r) {
        if (p->x == prev) continue;
        //if (s == x-1 && p->x - s > 0) continue;
        // eclipsam...
        elem *tembel = last ? last->r : L[s];
        tembel = p->r;

        //fprintf(stderr, "%d => %d (%d)\n", s, p->x, p->c);
        dist += p->c;
        prev = s;
        fixme(p->x/* < s ? -p->x : p->x*/);
        dist -= p->c;
        // revenim cu el
        tembel = p;
    }
}

int main()
{
    citire();
    fixme(x);
    //if (x-1 > 0) fixme(x-1);
    return 0;
}