Cod sursa(job #408132)
#include <fstream>
#include <vector>
using namespace std;
const int NMAX=50002;
struct Muchie {int x; short c;};
vector <Muchie> A[NMAX];
int d[NMAX];
int main()
{
ifstream fin("distante.in"); ofstream fout("distante.out");
int T;
fin>>T;
for (;T;--T)
{ int n,m,s,i,j;
fin>>n>>m>>s;
for (i=1;i<=n;++i) fin>>d[i];
if (d[s]) {fout<<"NU\n";
int x,y,z;
for (i=0;i<m;++i) fin>>x>>y>>z;
continue;
}
bool ok=true;
for (i=0;i<m;++i)
{ Muchie z; int x,y;
fin>>x>>y>>z.c;
z.x=y; A[x].push_back(z);
z.x=x; A[y].push_back(z);
if (!(d[x]+z.c>=d[y] || d[y]+z.c>=d[x])) ok=0;
}
if (!ok) {fout<<"NU\n";
for (i=1;i<=n;++i)A[i].clear();
continue;
}
int v;
for (v=1;v<=n&& ok;++v)
if (v!=s)
{ int ne=A[v].size(); ok=false;
for (j=0;j<ne;++j)
if (d[v]==d[A[v][j].x]+A[v][j].c) ok=true;
}
if (!ok) {fout<<"NU\n"; }
else fout<<"DA\n";
for (i=1;i<=n;++i)A[i].clear();
}
fin.close(); fout.close();
return 0;
}