Pagini recente » Cod sursa (job #299707) | Cod sursa (job #2381918) | Cod sursa (job #1198280) | Cod sursa (job #1330108) | Cod sursa (job #2429530)
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
struct lista{
int x,c;
};
vector <lista> v[50001];
int i,j,m,n,viz[50001],a,b,c,ii,s,t;
long long d[50001],ver[50001];
bool ok;
struct cmp{
bool operator()(int x, int y){
return d[x]>d[y];
}
};
priority_queue < int, vector<int>, cmp > q;
void coada(int x){
int nod,cost,j,vecin;
q.push(x);
viz[x]=1;
while(!q.empty()){
nod=q.top();
q.pop();
for(j=0;j<v[nod].size();j++) {
vecin=v[nod][j].x;
cost=v[nod][j].c;
if(d[nod]+cost<d[vecin]){
d[vecin]=d[nod]+cost;
if(viz[vecin]==0){
q.push(vecin);
viz[vecin]=1;
}
}
}
}
}
int main()
{
ifstream cin("distante.in");
ofstream cout("distante.out");
cin>>t;
for(ii=1;ii<=t;ii++){
cin>>n>>m>>s;
for(i=1;i<=n;i++)
cin>>ver[i];
for(i=1;i<=m;i++){
cin>>a>>b>>c;
v[a].push_back({b,c});
v[b].push_back({a,c});
}
for(i=1;i<=n;i++)
d[i]=INT_MAX;
d[s]=0;
coada(s);
ok=1;
for(i=1;i<=n;i++)
if(d[i]!=ver[i]){
ok=0;
break;
}
if(ok==1)
cout<<"DA"<<'\n';
else
cout<<"NU"<<'\n';
}
return 0;
}