Pagini recente » Cod sursa (job #2278427) | Cod sursa (job #2217372) | Cod sursa (job #2143705) | Cod sursa (job #1740542) | Cod sursa (job #284456)
Cod sursa(job #284456)
#include <stdio.h>
#include <string.h>
#define Nmax 50001
#define Inf 0x3f3f3f3f
int d[Nmax],d1[Nmax];
int x[2*Nmax],y[2*Nmax],c[2*Nmax];
int n,m,nod,T;
char s[20];
int main()
{
int i,j,ok,l;
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d\n", &T);
while(T--)
{
scanf("%d %d %d\n", &n,&m,&nod);
memset(d,0,sizeof(d));
for (i=1;i<=n;++i)
scanf("%d ", &d1[i]);
scanf("\n");
for (i=1;i<=m;++i)
{
gets(s);
//scanf("\n");
j=0;
while(s[j]!=' '){x[i]=x[i]*10+(long)(s[j]-'0');++j;}
++j;
while(s[j]!=' '){y[i]=y[i]*10+(long)(s[j]-'0');++j;}
++j;
l=strlen(s);
while(j<l){c[i]=c[i]*10+((long)s[j]-'0');++j;}
//scanf("%d %d %d\n", &x[i], &y[i], &c[i]);
if (x[i]==nod)
d[y[i]]=c[i],
d[x[i]]=c[i];
}
for (i=1;i<=n;++i)
if (d[i]==0)
d[i]=Inf;
d[nod]=0;
ok=1;
while(ok)
{
ok=0;
for (i=1;i<=m;++i)
if (d[y[i]]>d[x[i]]+c[i])
d[y[i]]=d[x[i]]+c[i],
ok=1;
else
if (d[x[i]]>d[y[i]]+c[i])
d[x[i]]=d[y[i]]+c[i],
ok=1;
}
ok=1;
for (i=1;i<=n;++i)
if (d[i]!=d1[i])
{
ok=0;
break;
}
if (ok==1)
printf("DA\n");
else
printf("NU\n");
}
return 0;
}