Pagini recente » Borderou de evaluare (job #713092) | Cod sursa (job #713407)
Cod sursa(job #713407)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
#define dim 50005
#define inf 0x3f3f3f3f
vector <pair <int,int> > v[dim];
int viz[dim], d[dim], check[dim],n , m, start;
struct cmp
{
bool operator() (const int &a, const int &b)
{
return d[a]>d[b];
}
};
priority_queue <int ,vector <int> , cmp>Heap;
void read()
{
int i, a, b, c;
fin>>n >>m >>start;
for(i=1;i<=n;++i)
fin>>check[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));
}
}
void dijkstra(int nod)
{
memset(d,inf,sizeof(d));
d[nod]=0;
Heap.push(nod);
while(!Heap.empty())
{
int re=Heap.top();
Heap.pop();
viz[re]=0;
for(int k=0;k<v[re].size();++k)
if(d[re]+v[re][k].second<d[v[re][k].first])
{
d[v[re][k].first]=d[re]+v[re][k].second;
if(viz[v[re][k].first]==0)
{
viz[v[re][k].first]=1;
Heap.push(v[re][k].first);
}
}
}
}
void solve()
{
int i,ok=1;
for(i=1;i<=n;++i)
if(check[i]!=d[i])
{ok=0;break;}
if(ok==0)
fout<<"NU\n";
else
fout<<"DA\n";
}
int main()
{
int t;
fin>>t;
for(;t;--t)
{
read();
dijkstra(start);
solve();
}
return 0;
}