Cod sursa(job #67914)

Utilizator DastasIonescu Vlad Dastas Data 25 iunie 2007 21:35:38
Problema Sate Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <cstdio>
#define maxn 30001

FILE *in = fopen("sate.in","r"), *out = fopen("sate.out","w");

int n, m, X, Y;
int fst;

struct graf
{
    int val, dist;
    graf *next;
};

graf *a[maxn] = {NULL};

void add(graf *&p, int v, int d)
{
    graf *q = new graf;
    q->val = v;
    q->dist = d;
    q->next = p;
    p = q;
}

void read()
{
    fscanf(in, "%d %d %d %d", &n, &m, &X, &Y);

    int t1, t2, d;
    for ( int i = 1; i <= m; ++i )
    {
        fscanf(in, "%d %d %d", &t1, &t2, &d);
        if ( t1 == X )
            fst = t2;
        else if ( t2 == X )
            fst = t1;
        add(a[t1], t2, d);
        add(a[t2], t1, d);
    }
}

void BF(int sursa, int dest)
{
    graf *p = new graf, *u = new graf;
    char viz[maxn] = {0};
    int v[maxn] = {0}; //v[i] == distanta pana in satul i de la sursa;
    v[fst] = a[sursa]->dist;
    //printf("%d\n\n", v[fst]);

    p->next = NULL;
    p->val = sursa;
    p->dist = a[sursa]->dist;

    viz[p->val] = 1;
    u = p;

    graf *s = new graf;

    while ( p )
    {
        graf *q = a[p->val];
        while ( q )
        {
            if ( !viz[q->val] )
            {
                viz[q->val] = 1;
                graf *t = new graf;
                t->next = NULL;
                t->dist = q->dist;
                t->val = q->val;
                u->next = t;
                u = t;

                v[u->val] = p->val < u->val ? v[p->val] + u->dist : v[p->val] - u->dist;

                //printf("%d %d %d\n", p->val, u->val, u->dist);
            }
            q = q->next;
        }
        graf *t = p;
        p = p->next;

        delete t;
    }

    fprintf(out, "%d\n", v[dest]);
}

int main()
{
    read();

    BF(X, Y);

	return 0;
}

/*
11 7 1 11
1 7 10
4 6 4
5 7 4
6 8 5
2 10 15
4 11 13
5 8 8

1 7 10
7 5 6
5 8 14
8 6 9
6 4 5
4 11 18
*/