Pagini recente » Cod sursa (job #1188117) | Cod sursa (job #1193645) | Cod sursa (job #1723759) | Cod sursa (job #2087232) | Cod sursa (job #157422)
Cod sursa(job #157422)
#include <stdio.h>
#include <stdlib.h>
#define NX 50010
int V, E, S, T;
int dist[ NX ];
struct ent {
int v, w;
struct ent *next;
};
typedef struct ent ent;
ent G[ NX ], *L[ NX ];
void add( int u, int v, int w ) {
L[u]->v = v, L[u]->w = w;
if( ! L[u]->next ) {
L[u]->next = (ent *) malloc( sizeof( ent ) );
L[u]->next->next = 0;
}
L[u] = L[u]->next;
}
int check() {
int i, k;
ent *e;
for( i = 1; i <= V; i++ ) // daca mai este posibila vreo relaxare
for( e = &G[i]; e != L[i]; e = e->next )
if( dist[ e->v ] > dist[ i ] + e->w )
return 0;
// daca fiecare are un predecesor
for( i = 1; i <= V; i++ ) {
if( i == S ) continue;
k = 0;
for( e = &G[i]; e != L[i]; e = e->next )
if( dist[ e->v ] + e->w == dist[ i ] )
k++;
if( k == 0 )
return 0;
}
return 1;
}
void cit() {
int i, u, v, w;
for( scanf( "%d", &T ); T; T-- ) {
scanf( "%d%d%d", &V, &E, &S );
for( i = 1; i <= V; i++ ) {
scanf( "%d", &dist[i] );
L[i] = &G[ i ];
}
for( ; E; E-- ) {
scanf( "%d%d%d", &u, &v, &w );
add( u, v, w );
if( u != v) add( v, u, w );
}
if( check() ) printf( "DA\n" );
else printf( "NU\n" );
}
}
int main() {
freopen( "distante.in", "r", stdin );
freopen( "distante.out", "w", stdout );
cit();
return 0;
}