Pagini recente » Cod sursa (job #2449388) | Cod sursa (job #1499209) | Cod sursa (job #2594153) | Cod sursa (job #927512) | Cod sursa (job #2521675)
#include <cstdio>
#include <queue>
#include <vector>
#define NMAX 50005
using namespace std;
struct nod{
int y;
int cost;
};
int t, n, m, s;
int dmindeverif[NMAX], dmin[NMAX];
int viz[NMAX];
int decateori[NMAX];
vector<nod>graph[NMAX];
queue<int>Q;
int parcurgere(){
Q.push(s);
viz[s]=1;
dmin[s]=0;
while(!Q.empty()){
int x=Q.front();
for(auto &v:graph[x]){
if(dmin[v.y] > dmin[x]+v.cost){
dmin[v.y]=dmin[x]+v.cost;
if(viz[v.y]==0)
Q.push(v.y);
viz[v.y]=1;
decateori[v.y]++;
if(decateori[v.y]>n){
return 0;
}
}
}
viz[x]=0;
Q.pop();
}
}
void init(){
for(int i=1; i<=n; i++)
{
dmin[i] = 0x3f3f3f3f;
viz[i] = 0;
graph[i].clear();
}
}
void teste(){
scanf("%d %d %d", &n, &m, &s);
init();
for(int i=1; i<=n; i++)
scanf("%d ", &dmindeverif[i]);
int x, y, c;
for(int i=1; i<=m; i++){
scanf("%d %d %d", &x, &y, &c);
graph[x].push_back({y, c});
graph[y].push_back({x, c});
}
int ok1 = parcurgere();
if(ok1 == 0)
printf("NU\n");
else{
dmin[s] = 0;
int ok=1;
for(int i=1; i<=n && ok==1; i++){
if(dmin[i] != dmindeverif[i])
ok=0;
}
if(ok == 0)
printf("NU\n");
else printf("DA\n");;
}
}
int main()
{
freopen("distante.in", "r", stdin);
freopen("distante.out", "w", stdout);
scanf("%d", &t);
for(int i=1; i<=t; i++)
teste();
return 0;
}