Cod sursa(job #2798470)

Utilizator VladS23Vlad Seba VladS23 Data 11 noiembrie 2021 12:30:36
Problema Sate Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <fstream>
#include <queue>
#include <vector>
#include <algorithm>

using namespace std;
using ll = long long;
using ull = unsigned long long;

ifstream cin("sate.in");
ofstream cout("sate.out");

const int NMAX = 3e4;
const int INF = ~(1 << 31);

int n, m, x, y;

struct NOD
{
    int nod;
    int dist;
};

vector<vector<NOD>> edges;
int viz[NMAX + 5];

/*void dfs(int node, int lastnode, int lastdist)
{

    viz[node] = 1;

    for (int k = 0; k < edges[node].size(); k++)
    {
        int nextnode = edges[node][k].nod;
        int nextdist = edges[node][k].dist;
        if (viz[nextnode] == 0)
        {
            if (node != 1)
            {
                int aux;

                if (lastnode < node && node < nextnode || lastnode > node && node > nextnode)
                    aux = lastdist + nextdist;
                else
                    aux = abs(lastdist - nextdist);
                edges[lastnode].push_back({nextnode, aux});
            }
            dfs(nextnode, node, nextdist);
        }
    }
}*/

void bfs(int start)
{
    queue<int> q;
    q.push(start);
    viz[start] = 0;

    while (!q.empty())
    {
        int node = q.front();
        q.pop();
        for (int k = 0; k < edges[node].size(); k++)
        {
            int nextnode = edges[node][k].nod;
            int nextdist = edges[node][k].dist;
            if (viz[edges[node][k].nod] == 0)
            {
                if (edges[node][k].nod > node)
                    viz[edges[node][k].nod] = viz[node] + edges[node][k].dist;
                else
                    viz[edges[node][k].nod] = viz[node] - edges[node][k].dist;
                q.push(edges[node][k].nod);
            }
        }
    }
}
int main()
{

    cin >> n >> m >> x >> y;
    edges.resize(n + 1);

    for (int i = 1; i <= m; i++)
    {
        int a, b, d;
        cin >> a >> b >> d;
        edges[a].push_back({b, d});
        edges[b].push_back({a, d});
    }
    bfs(x);
    cout << viz[y];
    return 0;
}