Cod sursa(job #3374232)

Utilizator AnlegliftIvanus Victor Gabriel Anleglift Data 8 noiembrie 2026 21:06:07
Problema Sate Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cmath>

/*
 * 1. Construiește un graf cu costuri orientat dublu: pentru fiecare muchie citită `(a, b, d)`, adaugă muchia `a -> b` cu costul `d` și muchia inversă `b -> a` cu costul `-d`.
 * 2. Pune nodul de pornire `x` într-o coadă pentru o parcurgere în lățime (BFS) și îi setează distanța 0.
 * 3. Extrage nodul curent din coadă și îi parcurge toți vecinii.
 * 4. Pentru fiecare vecin nevizitat, îi calculează distanța adunând costul muchiei la distanța nodului curent, îl marchează vizitat și îl adaugă în coadă.
 * 5. Când extrage nodul destinație `y` din coadă, afișează valoarea absolută a distanței calculate și încheie execuția.
 *
 * Complexitate: Timp O(N + M), Spațiu O(N + M).
 */

using namespace std;

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

const int MAXN = 30005;

vector<pair<int, int>> graph[MAXN];
bool visited[MAXN];
int dist[MAXN];

int main()
{
    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;
        graph[a].push_back({b, d});
        graph[b].push_back({a, -d});
    }

    queue<int> q;
    q.push(x);

    visited[x] = true;
    dist[x] = 0;

    while (!q.empty())
    {
        int node = q.front();
        q.pop();

        if (node == y)
        {
            fout << abs(dist[y]) << "\n";
            return 0;
        }

        for (int i = 0; i < graph[node].size(); i++)
        {
            int neighbour = graph[node][i].first;
            int distance = graph[node][i].second;

            if (!visited[neighbour])
            {
                visited[neighbour] = true;
                dist[neighbour] = dist[node] + distance;
                q.push(neighbour);
            }
        }
    }

    return 0;
}