Pagini recente » Cod sursa (job #2414645) | Cod sursa (job #1097139) | Cod sursa (job #70239) | Cod sursa (job #3122746) | Cod sursa (job #1563679)
#include<cstdio>
#include<cstring>
#include<vector>
#include<set>
#define INF 0x3f3f3f3f
#define DIM 50003
using namespace std;
FILE *fin = freopen("distante.in","r",stdin);
FILE *fout = freopen("distante.out","w",stdout);
int T, N, M, S;
int u[DIM];
vector < pair <int, int> > v[DIM];
set < pair <int, int> > SET;
void dijkstra(int);
int main()
{
int X, Y, Z;
for (scanf("%d", &T); T; T--)
{
scanf("%d%d%d", &N, &M, &S);
for (int i = 1; i <= N; i++)
scanf("%d", &u[i]);
for (int i = 1; i <= M; i++)
{
scanf("%d%d%d", &X, &Y, &Z);
v[X].push_back(make_pair(Y,Z));
v[Y].push_back(make_pair(X, Z));
}
dijkstra(S);
}
}
void dijkstra(int x)
{
int w[DIM];
memset(w, INF, sizeof(w));
w[x] = 0;
SET.insert(make_pair(0, x));
while (SET.size())
{
int nod = (*SET.begin()).second;
SET.erase(*SET.begin());
for (int i = 0; i < v[nod].size(); i++)
if (w[v[nod][i].first] > v[nod][i].second + w[nod])
{
w[v[nod][i].first] = v[nod][i].second + w[nod];
SET.insert(make_pair(w[v[nod][i].first], v[nod][i].first));
}
}
for (int i = 1; i <= N; i++)
{
if (w[i] == INF)
w[i] == 0;
if (w[i] != u[i])
{
printf("NU\n");
return;
}
}
printf("DA\n");
}