Cod sursa(job #3374326)

Utilizator iasmochinaTopala Iasmina iasmochina Data 8 noiembrie 2026 22:47:27
Problema Sate Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

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

const int NMAX = 30005;

int n, m, x, y;
// vecin[a][k]     = al k-lea sat legat direct de satul a
// deplasare[a][k] = cu cat ma mut daca merg din a in vecin[a][k]
//                   (pozitiv spre dreapta, negativ spre stanga)
vector<int> vecin[NMAX];
vector<int> deplasare[NMAX];
int pozitie[NMAX];   // pozitia fiecarui sat fata de X (X are pozitia 0)
bool vizitat[NMAX];

void bfs(int start) {
    queue<int> coada;
    coada.push(start);
    vizitat[start] = true;
    pozitie[start] = 0;

    while (!coada.empty()) {
        int sat = coada.front();
        coada.pop();
        for (int k = 0; k < vecin[sat].size(); k++) {
            int urmator = vecin[sat][k];
            if (!vizitat[urmator]) {
                vizitat[urmator] = true;
                pozitie[urmator] = pozitie[sat] + deplasare[sat][k];
                coada.push(urmator);
            }
        }
    }
}

int main() {
    fin >> n >> m >> x >> y;
    for (int k = 0; k < m; k++) {
        int i, j, d;
        fin >> i >> j >> d;
        vecin[i].push_back(j);   deplasare[i].push_back(d);    // din i in j: d km spre dreapta
        vecin[j].push_back(i);   deplasare[j].push_back(-d);   // din j in i: d km spre stanga
    }

    bfs(x);

    int distanta = pozitie[y];
    if (distanta < 0)
        distanta = -distanta;
    fout << distanta;
    return 0;
}