Pagini recente » Cod sursa (job #1775715) | Cod sursa (job #1978181) | Cod sursa (job #1448572) | Cod sursa (job #1213986) | Cod sursa (job #2633144)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
vector< pair <int, int> >v[50005];
priority_queue < pair <int, int> >dx;
int w[50005], dist[50005], i, m, n, p, j, a, b, c, t, ok;
void dijk()
{
int nod, i;
while(!dx.empty())
{
nod=dx.top().second;
for(i=0; i<v[nod].size(); i++)
if(w[v[nod][i].first]==0 || w[nod]+v[nod][i].second<w[v[nod][i].first])
{
w[v[nod][i].first]=w[nod]+v[nod][i].second;
dx.push(make_pair(w[v[nod][i].first], v[nod][i].first));
}
dx.pop();
}
}
int main()
{
fin >> t;
while(t)
{
fin >> n >> m >> p;
for(i=1; i<=n; i++)
fin >> dist[i];
for(i=1; i<=m; i++)
{
fin >> a >> b >> c;
v[a].push_back(make_pair(b, c));
// v[b].push_back(make_pair(a, c));
}
w[p]=1;
dx.push(make_pair(0, p));
dijk(); ok=0;
for(i=1; i<=n; i++)
{
if(dist[i]!=w[i]-1) ok=1;
w[i]=0;
v[i].clear();
}
if(ok) fout << "NU" << "\n";
else fout << "DA" << "\n";
t--;
}
return 0;
}