Pagini recente » Cod sursa (job #770938) | Cod sursa (job #417499) | Cod sursa (job #654803) | Cod sursa (job #2209628) | Cod sursa (job #42655)
Cod sursa(job #42655)
#include<stdio.h>
#include<string.h>
#define inf 32767
#define lg 50001
int T,n,m,s,c[lg],i,x,min,ok,y,C,d[lg];
char viz[lg];
typedef struct nod{int x,c;nod *urm;};
nod *g[lg],*p,*t;
void adaug(nod *&p,int y)
{if(!p) {p=new nod; p->urm=NULL;p->x=y;p->c=C;return;}
t=new nod;t->urm=p;
t->x=y;t->c=C;p=t;}
int main()
{freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&T);
for(;T;T--)
{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);
adaug(g[y],x);}
for(i=1;i<=n;i++)
{d[i]=inf;viz[i]=0;}
d[s]=0;
for(;;)
{min=inf;
for(i=1;i<=n;i++)
if(d[i]<min&&!viz[i]) {min=d[i]; s=i;}
if(min==inf) break ;
viz[s]=1;
for(;g[s];)
{if(!viz[g[s]->x]&&d[g[s]->x]>d[s]+g[s]->c) d[g[s]->x]=d[s]+g[s]->c;
t=g[s];
g[s]=g[s]->urm;
delete t;}
}
ok=1;
for(i=1;i<=n&&ok;i++)
if(d[i]!=c[i]) ok=0;
if(ok) printf("DA\n");
else printf("NU\n");}
fclose(stdout);
return 0;}