Cod sursa(job #2927832)

Utilizator MariusDinsorea32DinsoreanMarius MariusDinsorea32 Data 21 octombrie 2022 17:15:34
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <queue>
#include <set>
#define pr pair<int, int>

using namespace std;

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

const int N = 5e4 + 7, inf = 1e9;
int d[N];
vector <pr> v[N];
set <pr> s;

void dijkstra(int x, int n){
    for(int i = 1; i <= n; i++)
        d[i] = inf;
    d[x] = 0; s.insert({0, x});
    while(!s.empty()){
        pr y;
        y = *s.begin();
        s.erase(s.begin());
        int nod = y.second;
        for(pr i : v[nod]){
            int newnod = i.second, cost = i.first;
            if(d[newnod] > d[nod] + cost){
                d[newnod] = d[nod] + cost;
                s.insert(i);
            }
        }
    }
}

int main()
{
    int T;
    fin >> T;
    while(T--){
        int n, m, p;
        fin >> n >> m >> p;
        int dr[N];
        for(int i = 1; i <= n; i++)
            fin >> dr[i], v[i].clear();
        while(m--){
            int i, j, c;
            fin >> i >> j >> c;
            v[i].push_back({c, j});
            v[j].push_back({c, i});
        }
        dijkstra(p, n);
        bool ok = true;
        for(int i = 1; i <= n; i++){
            if(d[i] != dr[i]){
                ok = false;
                break;
            }
        }
        if(ok) fout << "DA\n";
        else fout << "NU\n";
    }
    return 0;
}