Cod sursa(job #67741)

Utilizator sandyxpSanduleac Dan sandyxp Data 25 iunie 2007 13:51:09
Problema Sate Scor 45
Compilator cpp Status done
Runda preONI 2007, Runda Finala, Clasa a 9-a si gimnaziu Marime 1.58 kb
#include <stdio.h>
#include <stdlib.h>

#include <map>
using namespace std;

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

int n, m, x, y;
int Used[MAXM];
map <pair<int, int>, int> ete;

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);
        ete[make_pair(a, b)] = i;
        ete[make_pair(b, a)] = i;
    }
}

long long dist = 0;
struct ceva { int s; elem *p; } S[MAXM*5]; // well teoretic e *2 dar ..
int t = -1;

void fixme(int s)
{
    S[++t] = (ceva) { x, L[s] };
    while (S[t].s != y && t >= 0) {
        if (S[t].p) {
            if (t && Used[ete[make_pair(S[t].p->x, S[t].s)]] ) {
                S[t].p = S[t].p->r;
                continue;
            }
            //fprintf(stderr, "%d => %d (%d)\n", S[t].s, S[t].p->x, S[t].p->c);
            Used[ete[make_pair(S[t].p->x, S[t].s)]] = 1;
            dist += S[t].p->c;
            // merg mai departe...
            S[t+1] = (ceva) { S[t].p->x, L[ S[t].p->x ] }; ++t;
            continue;
        }
        // ne intoarcem ...
        --t;
        dist -= S[t].p->c;
        Used[ete[make_pair(S[t+1].s, S[t].s)]] = 0; S[t].p = S[t].p->r;
    }
    printf("%lld\n", dist);
}

int main()
{
    citire();
    fixme(x);
    return 0;
}