Pagini recente » Cod sursa (job #1990308) | Cod sursa (job #765579) | Cod sursa (job #560042) | Cod sursa (job #2283948) | Cod sursa (job #284499)
Cod sursa(job #284499)
#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[200];
int main()
{
int i,j,ok;
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d", &T);
while(T--)
{
scanf("%d %d %d", &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);
j=0;
while (s[j]!=' '){x[i]=x[i]*10+s[j]-'0';j++;}j++;
while (s[j]!=' '){y[i]=y[i]*10+s[j]-'0';j++;}j++;
while (s[j]){c[i]=c[i]*10+s[j]-'0';j++;}
*/
scanf("%d %d %d", &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;
}