Pagini recente » Cod sursa (job #77641) | Cod sursa (job #3031849) | Cod sursa (job #2351054) | Cod sursa (job #2944875) | Cod sursa (job #1706565)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
#define DIM 50005
#define INF 0x3f3f3f
int vizt[ DIM ];
int dist[ DIM ];
int rasp[ DIM ];
vector < pair < int, int > > v[ DIM ];
priority_queue < pair < int, int > > Q;
void dijkstra( int x, int n );
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int n, m, i, j, t, x, y, c, k, ok;
scanf("%d",&t);
while( t-- ){
scanf("%d%d%d",&n,&m,&k);
for( i = 1; i <= n; ++i ){
scanf("%d",&rasp[ i ] );
dist[ i ] = INF;
}
for( i = 1; i <= m; ++i ){
scanf("%d%d%d",&x,&y,&c);
v[ x ].push_back({c,y});
v[ y ].push_back({c,x});
}
dijkstra( k , n );
ok = 1;
for( i = 1; i <= n; ++i ){
if( dist[ i ] != rasp[ i ] ) ok = 0;
dist[ i ] = 0;
vizt[ i ] = 0;
}
if( ok ) printf("DA\n");
else printf("NU\n");
for( i = 1; i <= n; ++i ) v[ i ].clear();
}
return 0;
}
void dijkstra( int x, int n ){
int i, c, y;
Q.push({0,x});
dist[x] = 0;
while( !Q.empty() ){
x = Q.top().second;
Q.pop();
if( vizt[ x ] ) continue;
vizt[ x ] = true;
for( i = 0; i < v[ x ].size(); ++i ){
c = v[ x ][ i ].first;
y = v[ x ][ i ].second;
if( dist[ y ] > dist[ x ] + c ){
dist[ y ] = dist[ x ] + c;
Q.push({-dist[ y ] ,y});
}
}
}
for( i = 1; i <= n; ++i )
if( dist[ i ] == INF ) dist[ i ] = 0;
}