Pagini recente » Cod sursa (job #326760) | Cod sursa (job #1379167) | Cod sursa (job #1789700) | Cod sursa (job #2365055) | Cod sursa (job #2033506)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int NMAX=50001;
const int inf=(1<<30);
priority_queue<pair<int,int> >c;
vector<pair<int,int> >L[NMAX];
int n,m,query,dist[NMAX],distinit[NMAX],varf;
bitset<NMAX>viz;
inline void Reset()
{
viz.reset();
for(int i=1;i<=n;i++)
L[i].clear();
while(!c.empty())
c.pop();
for(int i=1;i<=n;i++)
dist[i]=0;
}
inline void Dijkstra(int nod)
{
for(int i=1;i<=n;i++)
dist[i]=inf;
dist[nod]=0;
c.push({0,nod});
while(!c.empty())
{
int x=c.top().second;
c.pop();
if(!viz[x])
{
viz[x]=1;
for(int i=0;i<L[x].size();i++)
{
int p=L[x][i].first;
int q=L[x][i].second;
if(dist[p]>dist[x]+q)
{
dist[p]=dist[x]+q;
c.push({-dist[p],p});
}
}
}
}
}
inline bool Check()
{
int i;
for(i=1;dist[i]==distinit[i] && i<=n;i++)
;
return (i>n);
}
inline void Read_Solve()
{
fin>>query;
for(int i=1;i<=query;i++)
{
fin>>n>>m>>varf;
for(int j=1;j<=n;j++)
fin>>distinit[j];
for(int j=1;j<=m;j++)
{
int nod,nod1,cost;
fin>>nod>>nod1>>cost;
L[nod].push_back({nod1,cost});
L[nod1].push_back({nod,cost});
}
Dijkstra(varf);
bool sol=Check();
if(sol)
fout<<"DA\n";
else fout<<"NU\n";
Reset();
}
}
int main()
{
Read_Solve();
fin.close();
fout.close();
return 0;
}