Pagini recente » Cod sursa (job #255068) | Cod sursa (job #3032340) | Cod sursa (job #1749219) | Cod sursa (job #844414) | Cod sursa (job #276570)
Cod sursa(job #276570)
#include<stdio.h>
#include<string.h>
#define N 50005
#define INF 30000
struct nod{int info, cost;
nod *urm;} *prim[N], *p;
struct nod_c{int val;
nod_c *next;} *first, *last, *q;
int dist[N], n , m;
void bellman(int sursa);
void init()
{
for(int i = 1; i <= n; i++)
prim[i] = NULL;
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int T, k, d[N], x, y, c, sursa, ok, i;
scanf("%d", &T);
for(k = 1; k <= T; k++)
{
scanf("%d %d %d", &n, &m, &sursa);
init();
memset(d, 0, sizeof(d));
for(i = 1; i <= n; i++)
scanf("%d", &d[i]);
for(i = 1; i <= m; i++)
{
scanf("%d %d %d",&x, &y, &c);
p = new nod;
p->info = y;
p->cost = c;
p->urm = prim[x];
prim[x] = p;
p = new nod;
p->info = x;
p->cost = c;
p->urm = prim[y];
prim[y] = p;
}
bellman(sursa);
ok = 1;
for(i = 1; i <= n; i++)
if(dist[i] != d[i])
ok = 0;
if(ok == 0)
printf("NU\n");
else
printf("DA\n");
}
return 0;
}
void bellman(int sursa)
{
int viz[N], nod_cur;
memset(dist, INF, sizeof(dist));
memset(viz, 0, sizeof(viz));
dist[sursa] = 0;
first = new nod_c;
first->val = sursa;
first->next = NULL;
last = first;
viz[sursa] = 1;
while(first != NULL)
{
nod_cur = first->val;
viz[nod_cur] = 0;
for(p = prim[nod_cur]; p; p = p->urm)
if(dist[nod_cur] + p->cost < dist[p->info])
{
dist[p->info] = p->cost + dist[nod_cur];
if(viz[p->info] == 0)
{
q = new nod_c;
q->val = p->info;
q->next = NULL;
last->next = q;
last = q;
viz[p->info] = 1;
}
}
q = first;
first = first->next;
delete q;
}
}