Pagini recente » Cod sursa (job #710251) | Cod sursa (job #1139300) | Cod sursa (job #2954374) | Cod sursa (job #1280193) | Cod sursa (job #8960)
Cod sursa(job #8960)
#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, tt;
long int ip;
long int d[50001], s[50001], dd[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", &tt );
for ( i = 1; i <= tt; i++ )
{
prim = 0;
scanf ( "%ld %ld %ld", &n, &m, &ip );
for ( j = 1; j <= n; j++ )
scanf ( "%ld", &d[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++ )
{
dd[i] = 2000000000;
s[i] = 0;
}
for ( p = l[ip]; p; p = p->adr_urm )
{
dd[p->x] = p->cost;
add1 ( p->x, p->cost );
}
dd[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 ( dd[poz] + p->cost < dd[p->x] )
{
if ( dd[p->x] == 2000000000 )
{
//add1 ( p->x, dd[poz] + p->cost );
dd[p->x] = dd[poz] + p->cost;
}
else
dd[p->x] = dd[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, dd[i] );
//printf ( "\n" );
for ( i = 1; i <= n; i++ )
if ( d[i] != dd[i] )
break;
if ( i == n + 1 )
printf ( "DA\n" );
else
printf ( "NU\n" );
}