Cod sursa(job #3374811)

Utilizator carlosavbossAvramescu Carlos-Cristian carlosavboss Data 9 noiembrie 2026 14:05:02
Problema Sate Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;

const int NMAX = 30005;

// Lista de adiacenta: pentru fiecare sat retinem perechi (vecin, distanta cu semn).
vector< pair<int, int> > g[NMAX];
long long poz[NMAX];     // pozitia fiecarui sat pe axa, relativ la X (X are pozitia 0)
bool vizitat[NMAX];

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

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

    for (int k = 0; k < m; k++) {
        int i, j, d;
        scanf("%d %d %d", &i, &j, &d);
        // Satele sunt asezate in ordine pe axa, deci j (i < j) e la dreapta lui i.
        // Mergand de la i la j pozitia creste cu d, de la j la i scade cu d.
        g[i].push_back(make_pair(j, d));
        g[j].push_back(make_pair(i, -d));
    }

    // BFS din X: fixam X ca origine (pozitia 0) si calculam pozitia
    // fiecarui sat la care putem ajunge prin relatiile cunoscute.
    queue<int> q;
    q.push(x);
    vizitat[x] = true;
    poz[x] = 0;

    while (!q.empty()) {
        int u = q.front();
        q.pop();
        if (u == y) break;   // am aflat pozitia lui Y, nu mai e nevoie sa continuam

        for (size_t idx = 0; idx < g[u].size(); idx++) {
            int v = g[u][idx].first;
            int d = g[u][idx].second;
            if (!vizitat[v]) {
                vizitat[v] = true;
                poz[v] = poz[u] + d;   // pozitia vecinului = pozitia curenta + deplasarea
                q.push(v);
            }
        }
    }

    // Distanta dintre X si Y = diferenta pozitiilor, in modul.
    long long rez = poz[y] - poz[x];
    if (rez < 0) rez = -rez;
    printf("%lld\n", rez);

    return 0;
}