Cod sursa(job #2196851)

Utilizator 24601Dan Ban 24601 Data 20 aprilie 2018 15:46:43
Problema Sate Scor 60
Compilator c Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <limits.h>
#include <stdio.h>

#define NMAX 30000
#define MMAX 100024

static struct edge {
    int v;
    int d;
    int next;
} edges[2*MMAX+100];

static int adj_list[NMAX], dist[NMAX], q[NMAX<<2], visited[NMAX];

int main(void)
{
    int i, n, m, x, y, u, v, s, qt, qh;

    freopen("sate.in", "r", stdin);
    freopen("sate.out", "w", stdout);

    scanf("%d %d %d %d", &n, &m, &x, &y);

    for (i = 1; i <= m; i++) {
        scanf("%d %d %d", &u, &v, &s);

        edges[2*i].v = v;
        edges[2*i].d = s;
        edges[2*i].next = adj_list[u];
        adj_list[u] = 2*i;

        edges[2*i+1].v = u;
        edges[2*i+1].d = s;
        edges[2*i+1].next = adj_list[v];
        adj_list[v] = 2*i+1;
    }

    qh = qt = 0;
    q[qt++] = x;
    visited[x] = 1;

    while (qh < qt) {
        s = q[qh++];
        for (i = adj_list[s]; i != 0; i = edges[i].next) {
            if (!visited[edges[i].v]) {
                visited[edges[i].v] = 1;
                q[qt++] = edges[i].v;
                if (s < edges[i].v) {
                    dist[edges[i].v] = dist[s] + edges[i].d;
                } else {
                    dist[edges[i].v] = dist[s] - edges[i].d;
                }

                if (edges[i].v == y) {
                    printf("%d\n", dist[edges[i].v]);
                    return 0;
                }
            }
        }
    }
}