Cod sursa(job #2659799)

Utilizator OvidRata Ovidiu Ovid Data 17 octombrie 2020 14:17:21
Problema Distante Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include<bits/stdc++.h>
using namespace std;
#define INIT  ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define ll long long
#define pii pair<int, int>
#define count_bits __builtin_popcount
#define int ll

ifstream fin("distante.in"); ofstream fout("distante.out");
#define cin fin
#define cout fout


int t, n, m, s;
int D[50010], d[50010];
bool vr[50010];
vector<pii> g[50010];

void dijkstra(int s){
multiset<pii> ms;
d[s]=0;
ms.insert({d[s], s});
while(!ms.empty()){
    auto f=(*ms.begin()); ms.erase(ms.begin());
    int d0=f.ft, u=f.sc; vr[u]=true;
    for(auto nd:g[u]){
        int c=nd.sc, v=nd.ft;
        if(vr[v]){continue;}
        if(d[v]==(-1)){
            ms.insert({d0+c, v});
            d[v]=d0+c;
        }
        else{
            ms.erase(ms.find({d[v], v}));
            ms.insert({min(d0+c, d[v]), v});
            d[v]=min(d[v], d0+c);
        }
    }
}


}



int32_t main(){
INIT
cin>>t;


while(t--){
    cin>>n>>m>>s;
    for(int i=1; i<=n; i++){cin>>D[i]; d[i]=-1; vr[i]=false;g[i].clear(); }
    for(int i=1; i<=m; i++){
        int a, b, c; cin>>a>>b>>c; g[a].pb({b, c}); g[b].pb({a, c});
    }
    dijkstra(s);
    bool res=true;
    for(int i=1; i<=n; i++){
        //cout<<d[i]<<" ";
        if(d[i]!=D[i]){
            res=false; break;
        }
    }
    if(res){cout<<"DA\n";}
    else{cout<<"NU\n";}
}



return 0;
}