Cod sursa(job #2966701)

Utilizator Matei_MunteanuMunteanu Matei Ioan Matei_Munteanu Data 18 ianuarie 2023 10:47:20
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int t, n, m, s;
long long dist_real[50004];
long long dist[50004];
vector<pair<int, int>> adj[50004];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> Q;
void dijkstra()
{
    dist_real[s] = 0;
    Q.push({0, s});
    while (!Q.empty())
    {
        int v = Q.top().second;
        int d_v = Q.top().first;
        Q.pop();
        if (d_v != dist_real[v])
        {
            continue;
        }
        for (auto edge : adj[v])
        {
            int u = edge.first;
            int cost = edge.second;
            if (dist_real[v] + cost < dist_real[u])
            {
                dist_real[u] = dist_real[v] + cost;
                Q.push({dist_real[u], u});
            }
        }
    }
}
void solve()
{
    fin >> n >> m >> s;
    for (int i = 1; i <= n; i++)
    {
        fin >> dist[i];
    }
    for (int i = 1; i <= n; i++)
    {
        dist_real[i] = INT_MAX;
    }
    for (int i = 1; i <= n; i++)
    {
        adj[i].clear();
    }
    for (int i = 1; i <= m; i++)
    {
        int a, b, d;
        fin >> a >> b >> d;
        adj[a].push_back({b, d});
        adj[b].push_back({a, d});
    }
    dijkstra();
    bool ok = true;
    for (int i = 1; i <= n; i++)
    {
        if (dist[i] != dist_real[i])
        {
            ok = false;
            break;
        }
    }
    ok ? fout << "DA\n" : fout << "NU\n";
}
int main()
{
    fin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}