Cod sursa(job #3374513)

Utilizator gabiaAygan Gabriela Aylin gabia Data 9 noiembrie 2026 01:35:43
Problema Sate Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

// Idee: satele sunt pe o dreapta, deci fiecarui sat ii putem da o "pozitie".
// Pornim din X cu pozitia 0 si facem BFS: daca stim pozitia lui i si
// stim ca j e la D km la dreapta de i, atunci pozitie[j] = pozitie[i] + D
// (si invers pozitie[i] = pozitie[j] - D). La final raspunsul e |pozitie[Y]|.

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

const int NMAX = 30005;

int n, m, x, y;
vector< pair<int, int> > G[NMAX];   // (vecin, deplasare cu semn)
int pozitie[NMAX];
bool viz[NMAX];

int main() {
    fin >> n >> m >> x >> y;
    for (int k = 1; k <= m; k++) {
        int i, j, d;
        fin >> i >> j >> d;
        if (i > j) {            // in enunt i < j, dar sa fim siguri
            int aux = i;
            i = j;
            j = aux;
        }
        G[i].push_back(make_pair(j, d));    // j e la dreapta lui i
        G[j].push_back(make_pair(i, -d));   // i e la stanga lui j
    }

    queue<int> q;
    q.push(x);
    viz[x] = true;
    pozitie[x] = 0;

    while (!q.empty()) {
        int nod = q.front();
        q.pop();
        for (size_t k = 0; k < G[nod].size(); k++) {
            int vecin = G[nod][k].first;
            int d = G[nod][k].second;
            if (!viz[vecin]) {
                viz[vecin] = true;
                pozitie[vecin] = pozitie[nod] + d;
                q.push(vecin);
            }
        }
    }

    int rez = pozitie[y];
    if (rez < 0)
        rez = -rez;
    fout << rez << "\n";

    return 0;
}