Cod sursa(job #2262830)

Utilizator ShootingHorseHorsie Horse ShootingHorse Data 17 octombrie 2018 20:45:26
Problema Sate Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <stdio.h>
#include <stdbool.h>

#define MAX_NODES       30001
#define MAX_EDGES       (100024 * 2 + 1)
struct edge_t {
    int node;
    int value;
    int next;
} edges[MAX_EDGES];

int graph[MAX_NODES], edge_it = 1, dis[MAX_NODES];

void add_edge(int x, int y, int value)
{
    struct edge_t edge = {y, value, graph[x]};
    edges[edge_it] = edge;
    graph[x] = edge_it++;
}

void bfs(int start, int end)
{
    int q[MAX_NODES], q_push = 0, q_pop = 0;
    bool vis[MAX_NODES] = {};

    q[q_push++] = start;
    vis[start] = true;
    while (q_pop < q_push) {
        int node = q[q_pop++];
        struct edge_t edge = edges[graph[node]];

        while (edge.node) {
            if (!vis[edge.node]) {
                q[q_push++] = edge.node;
                vis[edge.node] = true;

                dis[edge.node] = dis[node] + (node < edge.node ? edge.value : (-edge.value));

                if (edge.node == end)
                    break;
            }

            edge = edges[edge.next];
        }

        if (edge.node == end)
            break;
    }
}

int main()
{
    int n, m, x, y;

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

    scanf("%d %d %d %d", &n, &m, &x, &y);
    while (m--) {
        int x, y, v;
        scanf("%d %d %d", &x, &y, &v);
        add_edge(x, y, v);
        add_edge(y, x, v);
    }

    bfs(x, y);

    printf("%d", dis[y] > 0 ? dis[y] : (-dis[y]));

    return 0;
}