Cod sursa(job #3300512)

Utilizator Lex._.Lexi Guiman Lex._. Data 16 iunie 2025 19:34:44
Problema Sate Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <bits/stdc++.h>
#define NMAX 30005
#define MMAX 100025
using namespace std;

vector<vector<pair<int, int>>> liste_adiacenta; ///pentru fiecare nod salvam toate nodurile cu care este conectat (primul numar din pereche reprezinta nodul si al doilea reprezinta distanta)

int main()
{
    ifstream cin("sate.in");
    ofstream cout("sate.out");
    int n, m, x, y;
    cin >> n >> m >> x >> y;
    liste_adiacenta.resize(n+1);
    ///vom transforma relatiile dintre sate intr-un graf, unde nodurile reprezinta satele si muchiile reprezinta relatiile
    for(int i=1; i<=m; i++) ///citim muchiile
    {
        int nod1, nod2, distanta;
        cin >> nod1 >> nod2 >> distanta; ///citim satele si distanta dintre ele
        liste_adiacenta[nod1].push_back({nod2, distanta}); ///salvam nodul si distanta
        liste_adiacenta[nod2].push_back({nod1, -distanta}); ///daca nodul adaugat in lista este mai mic ca nodul specific listei, salvam distanta cu minus
    }
    ///vom face o parcurgere bfs a grafului creat incepand de la nodul x
    queue<int> q;
    vector<int> distante(n+1, -1); ///distanta de la nodul x la celelalte noduri
    q.push(x);
    distante[x]=0;
    while(!q.empty())
    {
        int nod=q.front();
        q.pop();
        for(auto vecin : liste_adiacenta[nod]) ///parcurgem toate nodurile care au o muchie comuna cu nodul din coada
        {
            if(distante[vecin.first]==-1) ///daca nu am parcurs pana acum acel nod
            {
                distante[vecin.first]=distante[nod]+vecin.second; ///calculam distanta pana la acel nod (sat)
                q.push(vecin.first); ///il adaugam la coada
            }
        }
    }
    cout << distante[y]; ///afisam distanta de la x la y

    return 0;
}