Pagini recente » Cod sursa (job #652911) | Cod sursa (job #2529489) | Cod sursa (job #2651832) | Cod sursa (job #69422) | Cod sursa (job #2970159)
/// 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;
}