Cod sursa(job #2779376)

Utilizator BalasaRaduBalasa Radu BalasaRadu Data 3 octombrie 2021 15:51:53
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;

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

const int dim=500009,inf=1e18;

struct elem{
    int y,c;
    bool operator <(const elem a) const
    {
        return c>a.c;
    }
};

vector<elem>v[dim];
priority_queue<elem>q;

int n,m,start,ans[dim];
int d[dim];

void Dijkstra(int start){
    for(int i=1;i<=n;i++){
        d[i]=inf;
    }
    d[start]=0;
    q.push({start,0});
    while(!q.empty()){
        int x=q.top().y;
        int c=q.top().c;
        q.pop();
        if(c==d[x]){
            for(auto nod:v[x]){
                int y=nod.y;
                int cost=nod.c;
                if(d[y]>d[x]+cost){
                    d[y]=d[x]+cost;
                    q.push({y,d[y]});
                }
            }
        }
    }
}

void solve(){
        fin>>n>>m>>start;

    for(int i=1;i<=n;i++){
        fin>>ans[i];
    }

    for(int i=1;i<=m;i++){
        int x,y,c;
        fin>>x>>y>>c;
        v[x].push_back({y,c});
        v[y].push_back({x,c});
    }
    Dijkstra(start);
    int ok=1;
    for(int i=1;i<=n;i++){
        if(d[i]!=ans[i]){
            ok=0;
        }
    }
    if(ok)
        fout<<"DA";
    else
        fout<<"NU";
    for(int i=1;i<=n;i++){
        v[i].clear();
    }
}

signed main(){
    int t=1;
    fin>>t;
    while(t--){
        solve();
        fout<<'\n';
    }
}