Cod sursa(job #157422)

Utilizator amadaeusLucian Boca amadaeus Data 13 martie 2008 00:04:39
Problema Distante Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.33 kb
#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;
}