Pagini recente » Cod sursa (job #1368311) | Cod sursa (job #1872163) | Cod sursa (job #1959176) | Cod sursa (job #2889857) | Cod sursa (job #2766036)
#include<vector>
#include<fstream>
#include<queue>
using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");
#define INF 0x3f3f3f3f
typedef pair<int, int> iPair;
int t, n, m, p;
void dijkstra(int start,vector<iPair>*G,vector<int>&D){
priority_queue<iPair, vector<iPair>, greater<iPair>> Q;
Q.push(make_pair(0, start));
D[start] = 0;
while(!Q.empty()){
int node = Q.top().second;
if(Q.top().first>D[node]){
Q.pop();
continue;
}
Q.pop();
for(auto i:G[node]){
int v = i.first;
int weight=i.second;
if(D[v]>D[node]+weight){
D[v] = D[node] + weight;
Q.push(make_pair(D[v], v));
}
}
}
}
void read(){
cin >> n >> m >> p;
vector<iPair> *G;
vector<int> Sir;
vector<int> D;
D = vector<int>(n + 1, INF);
G = new vector<iPair>[n + 1];
Sir = vector<int>(n + 2);
for (int x, i = 1; i <= n;i++)
cin >> x,
Sir[i] = x;
for (int x, y, w, i = 1; i <= m; i++)
cin >> x >> y >> w,
G[x].push_back(make_pair(y, w)),
G[y].push_back(make_pair(x, w));
dijkstra(p,G,D);
for (int i = 1; i <= n;i++)
if(D[i]!=Sir[i]){
cout << "NU" << '\n';
return;
}
cout << "DA" << '\n';
}
int main(){
cin >> t;
for (int i = 1; i <= t;i++)
read();
}