Pagini recente » Cod sursa (job #2358774) | Cod sursa (job #248578) | Cod sursa (job #1495881) | Cod sursa (job #2782888) | Cod sursa (job #2729850)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");
const int N=5e4+5;
int n,m,x,y,cost,t,sursa;
int dist[N],ans[N];
bool inq[N];
vector< pair<int,int> >v[N];
struct cmp
{
bool operator()(int x,int y)
{
return ans[x]>ans[y];
}
};
priority_queue<int,vector<int>,cmp>q;
void dijkstra(int start)
{
memset(ans,-1,sizeof(ans));
ans[start]=0;
q.push(start);
inq[start]=true;
while(!q.empty())
{
int nod=q.top();
q.pop();
inq[nod]=false;
for(size_t i=0;i<v[nod].size();i++)
{
int el=v[nod][i].first;
int cost=v[nod][i].second;
if((cost+ans[nod]<ans[el])||(ans[el]==-1))
{
ans[el]=ans[nod]+cost;
if(inq[el]==false)
{
q.push(el);
inq[el]=true;
}
}
}
}
}
bool comp()
{
for(int i=1;i<=n;i++)
{
if(ans[i]!=dist[i])
{
return false;
}
}
return true;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m>>sursa;
for(int i=1;i<=n;i++)
{
cin>>dist[i];
}
for(int i=1;i<=m;i++)
{
cin>>x>>y>>cost;
v[x].push_back(make_pair(y,cost));
v[y].push_back(make_pair(x,cost));
}
dijkstra(sursa);
if(comp())
{
cout<<"DA\n";
}
else cout<<"NU\n";
for(int i=1;i<=n;i++)
{
v[i].clear();
}
}
return 0;
}