Pagini recente » Cod sursa (job #1837030) | Cod sursa (job #1804345) | Cod sursa (job #2242480) | Cod sursa (job #88340) | Cod sursa (job #2971598)
#include <fstream>
#include <cstring>
#include <set>
#include <climits>
#include <vector>
using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");
int i, j, n, m, k, x, y, ok, t, sursa, cost;
int d[50002], dist[50002];
vector <pair<int, int>> L[50002];
void dijsktra(int sursa){
for(int i=1;i<=n;i++)
dist[i]=INT_MAX;
dist[sursa]=0;
set<pair<int, int>> s;
s.insert({0, sursa});
while(!s.empty()){
int nod=s.begin()->second;
s.erase(s.begin());
for(int i=0;i<L[nod].size();i++){
int vecin=L[nod][i].first;
int cost=L[nod][i].second;
if(dist[vecin]>dist[nod]+cost){
s.erase({dist[vecin], vecin});
dist[vecin]=dist[nod]+cost;
s.insert({dist[vecin], vecin});
}
}
}
}
int main() {
cin>>t;
while(t--){
cin>>n>>m>>sursa;
for(i=1;i<=n;i++){
cin>>d[i];
}
for(i=1;i<=m;i++){
cin>>x>>y>>cost;
L[x].push_back({y, cost});
L[y].push_back({x, cost});
}
dijsktra(sursa);
ok=1;
for(i=1;i<=n;i++){
if(dist[i]!=d[i]){
ok=0;
break;
}
}
if(ok==0)
cout<<"NU"<<"\n";
else
cout<<"DA"<<"\n";
for(i=1;i<=n;i++){
L[i].clear();
}
}
}