Cod sursa(job #2828132)

Utilizator icnsrNicula Ionut icnsr Data 6 ianuarie 2022 21:48:19
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <iostream>
#include <vector>
#include <queue>
#include <climits>

std::vector<int>
distante_minime_dijkstra(const int src, const int n,
                         const std::vector<std::vector<std::pair<int, int>>>& adj)
{
        std::vector<char> visited(n + 1, false);
        std::vector<int> distance(n + 1, INT_MAX);
        distance[src] = 0;

        std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>,
                            std::greater<std::pair<int, int>>>
            q;

        q.push({0, src});

        while(!q.empty())
        {
                const int a = q.top().second;
                q.pop();

                if(visited[a])
                {
                        continue;
                }

                visited[a] = true;

                for(auto& e : adj[a])
                {
                        const int b = e.first;
                        const int w = e.second;

                        if(distance[a] + w < distance[b])
                        {
                                distance[b] = distance[a] + w;
                                q.push({distance[b], b});
                        }
                }
        }

        return distance;
}

void solve_one()
{
        int N, M, S;
        std::cin >> N >> M >> S;

        std::vector<int> d_orig(N + 1);
        for(int i = 1; i <= N; ++i)
        {
                std::cin >> d_orig[i];
        }
        d_orig[0] = INT_MAX;

        std::vector<std::vector<std::pair<int, int>>> adj(N + 1);
        for(int i = 0; i < M; ++i)
        {
                int a, b, w;
                std::cin >> a >> b >> w;

                adj[a].push_back({b, w});
                adj[b].push_back({a, w});
        }

        static constexpr const char* ans[] = {"NU\n", "DA\n"};

        std::cout << ans[d_orig == distante_minime_dijkstra(S, N, adj)];
}

int main()
{
        std::freopen("distante.in", "r", stdin);
        std::freopen("distante.out", "w", stdout);

        std::ios_base::sync_with_stdio(false);
        std::cin.tie(nullptr);

        int T;
        std::cin >> T;

        for(int t = 0; t < T; ++t)
        {
                solve_one();
        }
}