Pagini recente » Cod sursa (job #1918220) | Cod sursa (job #2929283) | Cod sursa (job #2320683) | Cod sursa (job #700111) | Cod sursa (job #3265264)
#include<fstream>
#include <queue>
#include<vector>
#include <utility>
using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");
int main() {
int t;
cin>>t;
for (int i=1;i<=t;i++) {
int n,m,s;
cin>>n>>m>>s;
vector<int> verify(n+1);
for (int j=1;j<=n;j++) {
cin>>verify[j];
}
vector<vector<pair<int,int>>>adi(n+1);
while (m) {
int srs,dest,cost;
cin>>srs>>dest>>cost;
adi[srs].emplace_back(cost,dest);
adi[dest].emplace_back(cost,srs);
m--;
}
priority_queue<pair<int,int>,vector<pair<int,int>>, greater<>> pq;
pq.push(make_pair(0,s));
vector<int> result(n+1,-1);
result[s]=0;
vector<bool>vizitat(n+1,false);
while (!pq.empty()) {
auto curent=pq.top();
pq.pop();
if (vizitat[curent.second])continue;
vizitat[curent.second]=true;
for (auto vecin: adi[curent.second]) {
if (result[vecin.second]==-1 || curent.first+vecin.first<result[vecin.second]) {
result[vecin.second]= curent.first+vecin.first;
pq.emplace(result[vecin.second],vecin.second);
}
}
}
bool ok=true;
for (int f=1;f<=n;f++) {
if (verify[f]!=result[f])ok=false;
}
if (ok) {
cout<<"DA"<<endl;
}
else cout<<"NU"<<endl;
}
return 0;
}