Pagini recente » Cod sursa (job #189318) | Istoria paginii runda/12_lmk_vs | Cod sursa (job #573708) | Cod sursa (job #2227856) | Cod sursa (job #563558)
Cod sursa(job #563558)
#include<cstdio>
#include<set>
#include<vector>
#include<cstring>
using namespace std;
const char in[]="distante.in";
const char out[]="distante.out";
int n, m ;
const int inf = 1<<30;
const int MaxN = 50100;
#define mp make_pair
#define pb push_back
int K, N, M, S;
int d[MaxN], dc[MaxN];
vector<int> G[MaxN], C[MaxN];
set< pair<int,int> >T;
int solve()
{
int nr = 0, i;
T.insert(mp(0, S));
while(T.size())
{
int val = (*T.begin()).first, x = (*T.begin()).second;
T.erase(*T.begin());
for(i = 0 ; i < G[x].size() ; ++i)
{
if(dc[G[x][i]] == val + C[x][i] && !d[G[x][i]] )++nr, d[G[x][i]] = 1, T.insert(mp(dc[G[x][i]], G[x][i]));
else if(dc[G[x][i]] < val + C[x][i])T.insert(mp(dc[G[x][i]], G[x][i]));
else if(dc[G[x][i]] > val + C[x][i]) return 0;
if(nr == N - 1) return 1;
}
}
return 0;
}
int main()
{
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%d", &K);
while(K--)
{
scanf("%d%d%d", &N, &M, &S);
memset(G, 0, MaxN);
memset(C, 0, MaxN);
for(int i = 1 ; i <= N; ++i)
scanf("%d", &dc[i]);
int a, b, c;
for(int i = 1 ; i <= M ; ++i)
scanf("%d%d%d", &a, &b, &c), G[a].pb(b), C[a].pb(c), G[b].pb(a), C[b].pb(c);
int ok = solve();
if(ok)printf("DA\n");
else printf("NU\n");
}
return 0;
}