Cod sursa(job #524681)
#include<fstream>
#include<vector>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
const int N=50001;
vector<int> v[N],c[N];
int n,m,s,t,d[N],e[N],ver[N];
void bfs(int s)
{
int st,dr,i;
st=dr=1;
d[st]=s;
e[s]=0;
while(st<=dr)
{
for(i=0;i<v[d[st]].size();i++)
{
if((!e[v[d[st]][i]]&&v[d[st]][i]!=s)||e[v[d[st]][i]]>e[d[st]]+c[d[st]][i])
{
d[++dr]=v[d[st]][i];
e[v[d[st]][i]]=e[d[st]]+c[d[st]][i];
}
}
st++;
}
}
int main()
{
int i,j,x,y,co;
bool ok;
f>>t;
for(i=1;i<=t;i++)
{
f>>n>>m>>s;
for(j=1;j<=n;j++)
f>>ver[j];
for(j=1;j<=n;j++)
{
v[i].clear();
c[j].clear();
}
for(j=1;j<=n;j++)
{
f>>x>>y>>co;
v[x].push_back(y);
v[y].push_back(x);
c[x].push_back(co);
c[y].push_back(co);
}
memset(e,0,sizeof(e));
bfs(s);
ok=true;
for(j=1;j<=n&&ok;j++)
if(ver[j]!=e[j])
ok=false;
if(ok)
g<<"DA\n";
else
g<<"NU\n";
}
return 0;
}