Pagini recente » Cod sursa (job #2592554) | Cod sursa (job #275542) | Cod sursa (job #1242601) | Cod sursa (job #3277880) | Cod sursa (job #147681)
Cod sursa(job #147681)
#include <stdio.h>
#include <vector>
using namespace std;
const int N_MAX = 50010;
vector <pair <int, int> > G[N_MAX];
int dist[N_MAX];
int main()
{
freopen("distante.in", "r", stdin);
#ifndef _SCREEN_
freopen("distante.out", "w", stdout);
#endif
int T, N, M, S, x, y, g, nod, c;
for (scanf("%d\n", &T); T; T --) {
scanf("%d %d %d\n", &N, &M, &S);
for (int i = 1; i <= N; i ++) {
scanf("%d ", &dist[i]);
G[i].clear();
}
for (int i = 1; i <= M; i ++) {
scanf("%d %d %d\n", &x, &y, &c);
G[x].push_back(make_pair(y, c));
G[y].push_back(make_pair(x, c));
}
vector <pair <int, int> >::iterator it;
g = 1;
int da = 1;
for (int i = 1; i <= N; i ++) {
if (i != S) {
nod = 0;
for (it = G[i].begin(); it != G[i].end(); ++ it) {
if (dist[it -> first] + (it -> second) < dist[i]) {
g = 0;
break;
}
if (dist[it -> first] + (it -> second) == dist[i]) nod ++;
}
// printf("nod = %d g = %d cati = %d\n", i, g, nod);
if (!g || !nod) {
printf("NU\n");
da = 0;
break;
}
}
}
if (da) printf("DA\n");
}
return 0;
}