Cod sursa(job #3375119)

Utilizator PuternicDezvoltatPuternicSRL PuternicDezvoltat Data 10 noiembrie 2026 13:06:27
Problema Sate Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
// https://www.infoarena.ro/problema/sate
// Complexitate: O(N+M) -> Fiecare sat este vizitat doar o data. In BFS() fiecare nod poate avea
// in total maxim 2M muchii (din prop. gradelor), deci avem O(N+2M) = O(N+M)

#include <bits/stdc++.h>
using namespace std;

// pune 0 daca pe pbinfo se cere citire de la tastatura (stdin/stdout)
#define FISIERE 1

#if FISIERE
ifstream fin("sate.in");
ofstream fout("sate.out");
#else
istream &fin = cin;
ostream &fout = cout;
#endif

int main() {
    int N, M, X, Y;
    fin >> N >> M >> X >> Y;
    // cerr << N << " " << M << " " << X << " " << Y << "\n";   // print(N,M,X,Y)

    vector<vector<pair<int, long long>>> drum(N + 1);
    for (int i = 0; i < M; i++) {
        int x, y;
        long long d;
        fin >> x >> y >> d;
        drum[x].push_back({y, d});    // de la satul mic spre cel mare: +d
        drum[y].push_back({x, -d});   // invers: -d
    }
    // for (int i = 1; i <= N; i++) ...   // print(drum)

    vector<char> vizitat(N + 1, 0);
    vector<long long> lungime(N + 1, 0);   // pozitia satului fata de X (inlocuieste coada2)
    queue<int> coada;

    coada.push(X);
    vizitat[X] = 1;
    lungime[X] = 0;
    bool ok = false;

    while (!coada.empty()) {
        int tata = coada.front();
        coada.pop();

        if (tata == Y) {
            ok = true;
            fout << llabs(lungime[tata]) << "\n";   // posibil sa fie X > Y, de aceea abs
            break;
        }
        for (auto &p : drum[tata]) {
            int vec = p.first;
            long long dr = p.second;
            if (!vizitat[vec]) {
                vizitat[vec] = 1;
                lungime[vec] = lungime[tata] + dr;
                coada.push(vec);
            }
        }
    }

    if (!ok) fout << "0\n";   // graful e conex in enunt, deci nu se ajunge aici
    return 0;
}