Pagini recente » Cod sursa (job #2116822) | Cod sursa (job #1959016) | Cod sursa (job #970104) | Cod sursa (job #2503319) | Cod sursa (job #932447)
Cod sursa(job #932447)
#include <cstdio>
#include <vector>
#define NMAX 50100
#define minim(a,b) ((a<b)?(a):(b))
#define oo 1<<30
using namespace std;
int N,M,S;
int A[NMAX];
bool ok;
struct node_structure {
int vecin,cost;
};
vector < node_structure > G[NMAX];
void Read() {
int x,y,c;
scanf("%d%d%d",&N,&M,&S);
for(int i=1;i<=N;++i)
scanf("%d",&A[i]);
while(M--) {
scanf("%d%d%d",&x,&y,&c);
G[x].push_back({y,c});
G[y].push_back({x,c});
}
}
void Verif_Dijkstra(int sursa) {
int i,dist;
unsigned j;
bool x;
ok=true;
for(i=1;i<=N;++i) {
if(i==sursa)
if(A[i]==0)
continue;
else {
ok=false;
return;
}
dist=oo;
x=false;
for(j=0;j<G[i].size();++j) {
if(A[i]+G[i][j].cost < A[G[i][j].vecin]) {
ok=false;
return;
}
if(A[i]== G[i][j].cost + A[G[i][j].vecin])
x=true;
}
if(x==false) {
ok=false;
return;
}
}
}
void Print() {
if(ok)
printf("DA\n");
else
printf("NU\n");
}
int main() {
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int T;
scanf("%d",&T);
while(T--) {
Read();
Verif_Dijkstra(S);
Print();
}
return 0;
}