Pagini recente » Cod sursa (job #751871) | Cod sursa (job #146384) | Cod sursa (job #775948) | Cod sursa (job #487520) | Cod sursa (job #963203)
Cod sursa(job #963203)
#include <stdio.h>
#define INF 1000
int main()
{
int t,c;
int a,b,s,i,n,m,j,d[715],d1[715],vizitat[715];
int dist[715][715];
FILE *in=fopen("distante.in","r");
FILE *out=fopen("distante.out","w");
fscanf(in,"%d",&t);
for(int i=0;i<t;i++)
{
fscanf(in,"%d %d %d",&n,&m,&s);
for(int j=1;j<=n;j++)
{
fscanf(in,"%ld",&d1[j]);
d[j]=INF;
vizitat[j]=0;
}
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
dist[j][k]=0;
}
for(int j=0;j<m;j++)
{
fscanf(in,"%d %d %d",&a,&b,&c);
dist[a][b]=c;
}
d[s]=0;
int small;
for (int k = 1; k <= n; ++k)
{
small = -1;
for (int l = 1; l <= n; ++l)
if (!vizitat[l] && ((small == -1) || (d[l] < d[small])))
small = l;
vizitat[small] = 1;
for (int l = 1; l <= n; ++l)
if (dist[small][l])
if (d[small] + dist[small][l] < d[l])
d[l] = d[small] + dist[small][l];
}
bool ok=true;
for(int j=1;j<=n;j++)
{
if(d1[j]!=d[j])
{
ok=false;
break;
}
}
if(ok)
{
fprintf(out,"DA\n");
}
else
{
fprintf(out,"NU\n");
}
}
fclose(in);
fclose(out);
return 0;
}