Pagini recente » Cod sursa (job #214050) | Cod sursa (job #770524) | Cod sursa (job #1581257) | Cod sursa (job #1755868) | Cod sursa (job #42639)
Cod sursa(job #42639)
#include<stdio.h>
#include<string.h>
#define inf 32767
#define N 50001
int t,n,m,s,c[N],i,x,y,C,d[N];
char viz[N];
typedef struct nod{int x,c;nod *urm;};
nod *g[N];
void del(nod *&p)
{nod *t;
while(p)
{t=p;p=p->urm;
delete t;}}
int dijkstra()
{int ok;
for(i=1;i<=n;i++)
{d[i]=inf;viz[i]=0;}
d[s]=0;
int min;nod *p;
for(;;)
{min=inf;ok=1;
for(i=1;i<=n;i++)
{ if(d[i]<min&&!viz[i]) {min=d[i]; s=i;}
ok=ok&&d[i]==c[i];}
if(min==inf) return ok;
viz[s]=1;
for(p=g[s];p;p=p->urm)
if(!viz[p->x]&&d[p->x]>d[s]+p->c) d[p->x]=d[s]+p->c;
del(g[s]);
}
}
void adaug(nod *&p,int y,int c)
{if(!p) {p=new nod;p->x=y;p->c=c;p->urm=NULL;return;}
nod *t;
t=new nod;
t->x=y;t->c=c;t->urm=p;p=t;}
int citire()
{scanf("%d %d %d",&n,&m,&s);
for(i=1;i<=n;i++) scanf("%d",&c[i]);
for(i=1;i<=m;i++)
{scanf("%d %d %d",&x,&y,&C);
adaug(g[x],y,C);
adaug(g[y],x,C);}
return dijkstra();}
int main()
{freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&t);
for(;t;t--)
{if(citire()) printf("DA\n");
else printf("NU\n");}
fclose(stdout);
return 0;}