Cod sursa(job #67918)

Utilizator DastasIonescu Vlad Dastas Data 25 iunie 2007 21:40:46
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>
#define maxn 30001

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

int n, m, X, Y;

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);
        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;

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

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

    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;

                if ( u->val == dest )
                {
                    fprintf(out, "%d\n", v[dest]);
                    return;
                }
            }
            q = q->next;
        }
        graf *t = p;
        p = p->next;

        delete t;
    }
}

int main()
{
    read();

    BF(X, Y);

	return 0;
}