Cod sursa(job #861013)
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define inf 100000000
ifstream f ("distante.in");
ofstream g ("distante.out");
struct nod_g{
int nod, cost;
};
vector< vector<nod_g> > graf;
vector<unsigned int> cost1;
vector<nod_g>::iterator it;
nod_g temp;
int n, m, t, s;
void citire(){
int x, y, c;
f >> n >> m >> s;
graf.clear();
cost1.clear();
graf.resize(n+1);
cost1.resize(n+1);
for(int i = 1; i <= n; ++i) f >> cost1[i];
for(int i = 1; i <= m; ++i){
f >> x >> y >> c;
temp.nod = y; temp.cost = c;
graf[x].push_back(temp);
}
}
void dijkstra(){
queue<unsigned int> coada;
vector<unsigned int> cost2;
int primul = s;
cost2.resize(n+1, inf);
cost2[s] = 0;
coada.push(primul);
while(!coada.empty()){
for(it = graf[primul].begin(); it != graf[primul].end(); ++it)
if(cost2[it->nod] > cost2[primul] + it->cost){
cost2[it->nod] = cost2[primul] + it->cost;
coada.push(it->nod);
}
coada.pop();
primul = coada.front();
}
for(int i = 1; i <= n; ++i){
if(cost2[i] == inf) cost2[i] = 0;
if(cost2[i] != cost1[i]){
g << "NU\n";
return;
}
}
g << "DA\n";
}
int main(){
f >> t;
for(int i = 1; i <= t; ++i){
citire();
dijkstra();
}
f.close();
g.close();
return 0;
}