Pagini recente » Cod sursa (job #2295410) | Cod sursa (job #1908442) | Cod sursa (job #2716395) | Cod sursa (job #2860834) | Cod sursa (job #2460728)
#include <bits/stdc++.h>
#define pii pair <int,int>
#define INF 0x3f3f3f3f
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
struct str{
int nod,cost;
bool operator <(const str&other) const
{
return cost>other.cost;
}
};
int n,m,s,t,drum1[50005],drum2[50005];
vector <pii> v[50005];
priority_queue <str> pq;
void dijkstra()
{
while(!pq.empty())
{
int nod=pq.top().nod;
int cost=pq.top().cost;
pq.pop();
if(cost!=drum2[nod])
continue;
for(auto it=v[nod].begin();it<v[nod].end();it++)
{
int nxt=(*it).first;
int cst=(*it).second;
if(drum2[nxt]>drum2[nod]+cst)
{
drum2[nxt]=drum2[nod]+cst;
pq.push({nxt,drum2[nxt]});
}
}
}
}
int main()
{
fin>>t;
while(t>0)
{
fin>>n>>m>>s;
for(int i=1;i<=n;i++)
{
fin>>drum1[i];
}
for(int i=1;i<=m;i++)
{
v[i].clear();
int x,y,z;
fin>>x>>y>>z;
v[x].push_back({y,z});
}
memset(drum2,INF,sizeof(drum2));
drum2[s]=0;
pq.push({s,0});
dijkstra();
int ok=1;
for(int i=1;i<=n;i++)
{
if(drum1[i]!=drum2[i])
ok=0;
}
if(ok)
fout<<"DA"<<'\n';
else
fout<<"NU"<<'\n';
t--;
}
return 0;
}