Cod sursa(job #2970159)

Utilizator MrPuzzleDespa Fabian Stefan MrPuzzle Data 24 ianuarie 2023 13:18:50
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
/// Aceasta sursa este pentru problema
/// https://infoarena.ro/problema/distante
/// Punctaj: 100
/// Grupa Avansata

#include<fstream>
#include<iostream>
#include<climits>
#include<algorithm>
#include<cstring>
#include<cmath>
#include <vector>
#include <queue>

#define DIM 50000
#define INF 100000000

using namespace std;

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

//ifstream f("in.in");
//ofstream g("out.out");

typedef pair<int,int> iPair;

int t;
int n,m,s;
int x,y,cost;
int check[DIM+5];
int D[DIM+5];

void solve(){

    vector<iPair> l[DIM+5];
    priority_queue <iPair,vector<iPair>,greater<iPair>> pq;

    f>>n>>m>>s;

    for(int i=1;i<=n;i++){
        f>>check[i];
        D[i] = INF;
    }
    D[s] = 0;
    pq.push({0,s});

    for(int i=1;i<=m;i++){
        f>>x>>y>>cost;
        l[x].push_back({y,cost});
        l[y].push_back({x,cost});
    }

    while(!pq.empty()){
        int nod = pq.top().second;
        int val = pq.top().first;

        pq.pop();

        if(val != D[nod]){
            continue;
        }

        for(int i=0;i<l[nod].size();i++){
            int vec = l[nod][i].first;
            int len = l[nod][i].second;

            if(D[vec] > D[nod] + len){
                D[vec] = D[nod] + len;
                pq.push({D[vec],vec});
            }
        }
    }

    bool ok=1;
    for(int i=1;i<=n;i++){
        //cout<<D[i]<<" ";
        if(check[i]!=D[i]){
            ok=0;
            break;
        }
    }
    //cout<<'\n';

    if(ok){
        g<<"DA\n";
    }else{
        g<<"NU\n";
    }

}


int main(){

    f>>t;

    while(t--){
        solve();
    }

    f.close();
    g.close();
    return 0;
}