Pagini recente » Cod sursa (job #677112) | Cod sursa (job #2941838) | Cod sursa (job #972830) | Cod sursa (job #161277) | Cod sursa (job #2761124)
///#include <iostream>
#include <fstream>
#include <set>
const int SIZE = 5e4+10,
INF = 1e8;
using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");
int t, n, m, start;
int dists[SIZE], d[SIZE];
set <pair<int, int>> v[SIZE];
void reset()
{
for(int i=1; i<=n; i++)
d[i]=INF, v[i].clear();
}
void cinGraph()
{
int y, x, c;
for(int i=1; i<=m; i++)
{
cin>>y>>x>>c;
v[y].insert({c, x});
v[x].insert({c, y});
}
}
void coutSet(auto st)
{
for(auto el : st) cout<<"\t - "<<el.first<<' '<<el.second<<"\n";
cout<<"***\n";
}
void dijkstra()
{
int nod, nxt;
pair <int, int> cnod;
set <pair<int, int>> q;
q.insert({0, start});
while(!q.empty())
{
cnod=*q.begin();
q.erase(q.begin());
nod=cnod.second;
if(d[nod]==INF)
{
d[nod]=cnod.first;
for(auto cnxt : v[nod])
{
nxt=cnxt.second;
if(d[nxt]>d[nod]+cnxt.first)
q.insert({d[nod]+cnxt.first, nxt});
}
}
}
}
bool check()
{
for(int i=1; i<=n; i++)
if(dists[i]!=d[i])
return 0;
return 1;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m>>start;
reset();
for(int i=1; i<=n; i++)
cin>>dists[i];
cinGraph();
dijkstra();
if(check()) cout<<"DA\n";
else cout<<"NU\n";
}
return 0;
}