Cod sursa(job #3272451)

Utilizator mateilucaLuca Matei Gabriel mateiluca Data 29 ianuarie 2025 13:47:41
Problema Sate Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("sate.in");
ofstream fout("sate.out");
int n, m, x, y, sol, d_x, d_y;
vector< pair<int, int> > G[30005];
queue< pair<int, int> > q;
bool viz[30005];
void Dfs(int x)
{
    viz[x] = 1;
    for(auto e : G[x])
        if(viz[e.first] == 0)
            Dfs(e.first);
}
void Bfs(int a)
{
    int nod, dist, cost;
    q.push({a, 0});
    viz[a] = 1;
    if(a == x) d_x = 0;
    while(!q.empty())
    {
        auto f = q.front();
        q.pop();
        a = f.first;
        dist = f.second;
        if(viz[x] == 1 && viz[y] == 1)
        {
            fout << d_y - d_x << "\n";
            fout.close();
            exit(0);
        }
        for(auto e : G[a])
        {
            nod = e.first;
            cost = e.second;
            if(viz[nod] == 0)
            {
                if(nod < a)
                {
                    q.push({nod, dist - cost});
                    if(nod == x)
                        d_x = dist - cost;
                    if(nod == y)
                        d_y = dist - cost;
                    viz[nod] = 1;
                }
                else{
                    q.push({nod, dist + cost});
                    if(nod == x)
                        d_x = dist + cost;
                    if(nod == y)
                        d_y = dist + cost;
                    viz[nod] = 1;
                }
            }
        }
    }
}

int main()
{
    int i, j, c;
    fin >> n >> m >> x >> y;
    while(m)
    {
        fin >> i >> j >> c;
        G[i].push_back({j, c});
        G[j].push_back({i, c});
        m--;
    }
    Dfs(x);
    for(i = 1;i <= n && viz[i] == 0;i++)
        ;
    for(j = 1;j <= n;j++)
        viz[j] = 0;
    Bfs(i);
    return 0;
}