Pagini recente » Cod sursa (job #1049640) | Cod sursa (job #266954) | Cod sursa (job #3041380) | Cod sursa (job #2555098) | Cod sursa (job #8959)
Cod sursa(job #8959)
#include <stdio.h>
#include <iomanip.h>
typedef struct nod
{
long int x, cost;
nod *adr_urm;
}*pnod;
pnod l[50001], prim, ultim;
long int m, n, teste;
long int ip;
long int sir[50001], s[50001], dis[50001];
void citire ();
void add ( long int i, long int j, long int k );
void add1 ( long int i, long int j );
void dijkstra ();
void afisare ();
int main ()
{
freopen ( "distante.in", "r", stdin );
freopen ( "distante.out", "w", stdout );
citire ();
return 0;
}
void citire ()
{
long int i;
long int x, y, k, j;
scanf ( "%ld", &teste );
for ( i = 1; i <= teste; i++ )
{
scanf ( "%ld %ld %ld", &n, &m, &ip );
for ( j = 1; j <= n; j++ )
scanf ( "%ld", &sir[j] );
for ( j = 1; j <= m; j++ )
{
scanf ( "%ld %ld %ld", &x, &y, &k );
add (x, y, k );
add (y, x, k );
}
dijkstra ();
afisare ();
}
}
void add ( long int i, long int j, long int k )
{
pnod p = new nod;
p->x = j;
p->cost = k;
p->adr_urm = l[i];
l[i] = p;
}
void dijkstra ()
{
long int i, j, k;
long int poz, ind;
long int min;
pnod p;
for ( i = 1; i <= n; i++ )
{
dis[i] = 2000000000;
s[i] = 0;
}
for ( p = l[ip]; p; p = p->adr_urm )
{
dis[p->x] = p->cost;
add1(p->x,p->cost);
}
dis[ip] = 0;
for ( i = 1; i <= n; i++ )
{
//if ( i == ip )
// continue;
min = 2000000000;
for ( p = prim; p; p = p->adr_urm )
if ( !s[p->x] && p->cost < min )
{
min = p->cost;
poz = p->x;
}
s[poz] = 1;
for ( p = l[poz]; p; p = p->adr_urm )
if ( dis[poz] + p->cost < dis[p->x] )
{
dis[p->x] = dis[poz] + p->cost;
}
}
}
void add1 ( long int i, long int cost )
{
pnod p = new nod;
p->x = i;
p->cost = cost;
p->adr_urm = prim;
prim = p;
}
void afisare ()
{
long int i;
//for ( i = 1; i <= n; i++ )
// printf ( "%ld %ld %ld\n", ip, i, dis[i] );
//printf ( "\n" );
for ( i = 1; i <= n; i++ )
if ( sir[i] != dis[i] )
break;
if ( i == n + 1 )
printf ( "DA\n" );
else
printf ( "NU\n" );
}