Cod sursa(job #508618)
#include<fstream.h>
#include<iostream.h>
ifstream f("distante.in");
ofstream g("distante.out");
long n,m,i,j,k,l,min,max,poz,y,OK,x,t;
long long mat[1000][1000],d[50000],s[50000],zaharel[50000];
int main(){
f>>t;
for (i=1;i<=t;i++)
{ f>>n>>m>>x;
for (j=1;j<=n;j++) f>>zaharel[j];
for (j=1;j<=m;j++)
{ f>>k>>l>>mat[k][l];
mat[l][k]=mat[k][l];
}
s[x]=1;
for (j=1;j<=n;j++) d[j]=mat[x][j];
min=max=999999999;
for (j=1;j<=n-1;j++)
{ y=0;
for (k=1;k<=n;k++)
{ if (!d[k] && k!=x) d[k]=max;
if (d[k]<min && !s[k] && d[k]) { min=d[k]; poz=k; }
}
if (min==max) poz=y;
s[poz]=1;
for (k=1;k<=n;k++)
if (!s[k] && d[k]>d[poz]+mat[poz][k] && mat[poz][k])
d[k]=d[poz]+mat[poz][k];
min=max;
}
OK=1;
for (j=1;j<=n && OK;j++)
if (d[j]!=zaharel[j]) OK=0;
if (OK) g<<"DA"<<'\n';
else g<<"NU"<<'\n';
}
f.close();
g.close();
return 0;
}