Cod sursa(job #2955835)

Utilizator pifaDumitru Andrei Denis pifa Data 17 decembrie 2022 22:04:22
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("distante.in");
ofstream out("distante.out");

int n, m, sursa;

const int N = 500001;

vector <pair <int, int>> g[2 * N + 1];

int dist[N + 1], viz[N + 1], init[N + 1];

struct cmp
{
    bool operator()(int l, int c)
    {
        return dist[l] >= dist[c];
    }
};

priority_queue <int, vector <int>, cmp> pq;

void dijkstra(vector <pair <int, int>> g[2 * N + 1], int sursa)
{
    dist[sursa] = 0;
    pq.push(sursa);
    viz[sursa] = 1;
    while(!pq.empty())
    {
        int nod = pq.top();
        pq.pop();
        viz[nod] = 0;
        for(int i = 0; i < g[nod].size(); i++)
        {
            int vecin = g[nod][i].first;
            int cost = g[nod][i].second;
            if(dist[nod] + cost < dist[vecin])
            {
                dist[vecin] = dist[nod] + cost;
                if(!viz[vecin])
                {
                    pq.push(vecin);
                    viz[vecin] = 1;
                }
            }
        }
    }
}

int main()
{
    int t;
    in >> t;
    while(t--)
    {
        in >> n >> m >> sursa;
        for(int i = 1; i <= n; i++)
            in >> init[i];
        for(int i = 1; i <= m; i++)
        {
            int a, b, c;
            in >> a >> b >> c;
            g[a].push_back({b, c});
            g[b].push_back({a, c});
        }
        for(int i = 1; i <= n; i++)
            dist[i] = INT_MAX;
        dijkstra(g, sursa);
        int ok = 0;
        for(int i = 1; i <= n; i++)
        {
            if(dist[i] != init[i])
            {
                ok = 1;
                break;
            }
        }
        out << (ok ? "NU\n" : "DA\n");
        memset(viz, 0, sizeof(viz));
    }
    return 0;
}