Cod sursa(job #2809667)

Utilizator andreimocianAndrei Mocian andreimocian Data 27 noiembrie 2021 12:44:44
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

struct el
{
    int node, cost;
    bool operator < (const el &A) const{
        return cost > A.cost;
    }
};

const int INF = 1e9;
int t, n, m, s;
bool ok = false;
int dist[50005], dp[50005];
vector < el > L[50005];
priority_queue < el > Q;

void Dijkstra(int s)
{
    dp[s] = 0;
    el w2;
    w2.node = s;
    w2.cost = 0;
    Q.push(w2);
    while(!Q.empty())
    {
        el w = Q.top();
        Q.pop();
        for(auto it : L[w.node])
        {
            if(dp[it.node] > dp[w.node] + it.cost)
            {
                dp[it.node] = dp[w.node] + it.cost;
                w2.node = it.node;
                w2.cost = dp[it.node];
                Q.push(w2);
            }
        }
    }
}

int main()
{
    int x, y, z;
    el w;
    fin >> t;
    for(int test = 1; test <= t; test++)
    {
        fin >> n >> m >> s;
        for(int i = 1; i <= n; i++)
        {
            fin >> dist[i];
            dp[i] = INF;
        }
        for(int i = 1; i <= m; i++)
        {
            fin >> x >> y >> z;
            w.node = y;
            w.cost = z;
            L[x].push_back(w);
            w.node = x;
            w.cost = z;
            L[y].push_back(w);
        }
        Dijkstra(s);
        ok = true;
        for(int i = 1; i <= n; i++)
        {
            if(dist[i] != dp[i])
                ok = false;
        }
        if(ok == true)
            fout << "DA" << "\n";
        else
            fout << "NU" << "\n";
        for(int i = 1; i <= n; i++)
        {
            L[i].clear();
        }
    }
    return 0;
}