Pagini recente » Cod sursa (job #2840232) | Borderou de evaluare (job #3332166) | Borderou de evaluare (job #3339630) | Cod sursa (job #3330596) | Cod sursa (job #3355800)
#include <bits/stdc++.h>
#define cin fin
#define cout fout
#define int long long
using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");
int n,m,t;
int comp[50005];
int rez[50005];
signed main()
{
cin>>t;
for(int y=1; y<=t; y++)
{
int s;
cin>>n>>m>>s;
for(int i=1;i<=n;i++)
cin>>comp[i];
vector<vector<pair<int,int>>>vc;
vc.resize(n+1);
for(int i=1; i<=n; i++)
rez[i]=5000000005ll;
for(int i=1; i<=m; i++)
{
int mds,mds2,val;
cin>>mds>>mds2>>val;
vc[mds].push_back({mds2,val});
vc[mds2].push_back({mds,val});
}
rez[s]=0;
priority_queue<pair<int,int>, vector <pair<int, int>>>q;
q.push({0,s});
while(!q.empty())
{
int vl=q.top().first*-1;
int poz=q.top().second;
q.pop();
if(vl!=rez[poz])
continue;
for(int i=0; i<vc[poz].size(); i++)
{
int poz2=vc[poz][i].first;
if(rez[poz2]>vl+vc[poz][i].second)
{
rez[poz2]=vl+vc[poz][i].second;
q.push({-rez[poz2],poz2});
}
}
}
int ok=0;
for(int i=1;i<=n;i++)
{
if(rez[i]!=comp[i])
{
ok++;
break;
}
}
if(ok==0)
cout<<"DA"<<'\n';
else
cout<<"NU"<<'\n';
}
return 0;
}