Cod sursa(job #3374812)

Utilizator carlosavbossAvramescu Carlos-Cristian carlosavboss Data 9 noiembrie 2026 14:13:33
Problema Sate Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
using namespace std;

ifstream fin("sate.in");
ofstream fout("sate.out");

const int NMAX = 30005;
const int MMAX = 100030;

int n, m, x, y;

// Liste de adiacenta implementate cu vectori statici.
// Fiecare relatie (i, j, D) devine doua muchii: i -> j cu +D si j -> i cu -D.
int lst[NMAX];          // lst[u] = indicele primei muchii din lista lui u (0 = lista goala)
int vecin[2 * MMAX];    // vecin[k] = celalalt capat al muchiei k
int dist[2 * MMAX];     // dist[k] = deplasarea cu semn (+ spre dreapta, - spre stanga)
int urm[2 * MMAX];      // urm[k]  = urmatoarea muchie din aceeasi lista
int nrm;                // cate muchii am adaugat

long long poz[NMAX];    // pozitia fiecarui sat pe axa, relativ la X (X are pozitia 0)
bool vizitat[NMAX];
int coada[NMAX];

void adauga(int u, int v, int d) {
    nrm++;
    vecin[nrm] = v;
    dist[nrm] = d;
    urm[nrm] = lst[u];
    lst[u] = nrm;
}

int main() {
    fin >> n >> m >> x >> y;
    for (int k = 1; k <= m; k++) {
        int i, j, d;
        fin >> i >> j >> d;
        // Satele sunt in ordine pe axa, deci j (i < j) e la dreapta lui i:
        // de la i la j pozitia creste cu d, de la j la i scade cu d.
        adauga(i, j, d);
        adauga(j, i, -d);
    }

    // BFS din X: fixam X ca origine si calculam pozitia satelor la care ajungem.
    int st = 1, dr = 0;
    coada[++dr] = x;
    vizitat[x] = true;
    poz[x] = 0;

    while (st <= dr) {
        int u = coada[st++];
        if (u == y) break;   // am aflat pozitia lui Y, ne putem opri

        for (int k = lst[u]; k != 0; k = urm[k]) {
            int v = vecin[k];
            if (!vizitat[v]) {
                vizitat[v] = true;
                poz[v] = poz[u] + dist[k];   // pozitia vecinului = pozitia curenta + deplasarea
                coada[++dr] = v;
            }
        }
    }

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

    return 0;
}