Cod sursa(job #3373552)

Utilizator Paul13Frincu Paul-Octavian Paul13 Data 7 noiembrie 2026 11:32:41
Problema Sate Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
// bibliotecile necesare
#include<iostream>
#include<vector>
#include<queue>
#include<fstream>
#include<cstdlib>
using namespace std;

// fisierele pe care le folosim
ifstream fin("sate.in");
ofstream fout("sate.out");

// aici declar graful
vector<pair<int, int>> graf[30001];  // vecinii fiecarui sat si dist sub forma de perechi
bool vizitat[30001] = {}; // o variablia sa stiu daca am vizitat sau nu un nod
int dist[30001] = {}; // si distanta relativa fata de satul x


int main() {

    // introduc datele din fisier si construiesc graful
    int n, m, x, y;
    fin >> n >> m >> x >> y;

    for(int i = 0; i < m; i++){
        int a, b, d;
        fin >> a >> b >> d;

        graf[a].push_back({b, d});
        graf[b].push_back({a, d});
    }

    // ma folosesc de o coada
    queue<int> q;

    q.push(x); // introduc primul nod in coada
    vizitat[x] = true; // il delcar vizitat
    dist[x] = 0; // si pentru moment distanta e 0


    // cat timp mai am ceva de citit din coada
    while(!q.empty()){
        int nod = q.front(); // ma folosesc de o variabila nod in care pun primul element
        q.pop(); // si il si scot

       // cout << nod << " "; nu e necesar dar se observa modul in care parcurge bfs ul graful

        for(auto p : graf[nod]){ // parcurg lista de adiacenta
            int vecin = p.first; // primul element din pereche e vecinul
            int d = p.second; // al doilea este distanta fata de vecin
            
            if(!vizitat[vecin]){ // daca nu l am mai vizitat
                vizitat[vecin] = true;

                if(vecin > nod) // daca e la dreapta
                    dist[vecin] = dist[nod] + d; // adaug d la distanta
                else // daca e la stanga
                    dist[vecin] = dist[nod] - d; // scad d la distanta

                q.push(vecin); // il punem si pe el in coada
            }

        }
    }

    fout << abs(dist[y]) << '\n'; // afisam modulul, daca am avea un caz de distanta de la 10 la 1

    return 0;
}