Pagini recente » Cod sursa (job #603430) | Cod sursa (job #1173436) | Cod sursa (job #1427429) | Cod sursa (job #321590) | Cod sursa (job #2083425)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream in ("distante.in");
ofstream out ("distante.out");
int const nmax = 50000;
int const inf = 1000000000;
struct Edge{
int to;
int cost;
};
struct Node{
int val;
int index;
bool operator > (Node a) const{
if(val != a.val){
return val > a.val;
} else{
return index > a.index;
}
}
};
vector<Edge> g[5 + nmax];
int n , m , source;
int d[5 + nmax];
int dp[5 + nmax];
int seen[5 + nmax];
void dijkstra(){
priority_queue< Node ,vector<Node> ,greater<Node> > pq;
dp[source] = 0;
pq.push({0 , source});
while(0 < pq.size()){
int node = pq.top().index;
pq.pop();
if(seen[node] == 0){
seen[node] = 1;
for(int i = 0 ; i < g[node].size() ;i++){
Edge e = g[node][i];
if(seen[e.to] == 0){
if(dp[node] + e.cost < dp[e.to]){
dp[e.to] = dp[node] + e.cost;
pq.push({dp[e.to] , e.to});
}
}
}
}
}
}
int main()
{
int t;
in>>t;
for(int tcase = 1 ; tcase <= t ;tcase++){
in>>n>>m>>source;
for(int i = 1 ; i <= n ;i++){
in>>d[i];
g[i].clear();
dp[i] = inf;
seen[i] = 0;
}
for(int i = 1 ; i <= m ;i++){
int a , b , c;
in>>a>>b>>c;
g[a].push_back({b , c});
g[b].push_back({a , c});
}
dijkstra();
bool ok = 0;
for(int i = 1 ; i <= n ;i++){
if(dp[i] != d[i]){
ok = 1;
}
}
if(ok == 0){
out<<"DA\n";
} else if(ok == 1){
out<<"NU\n";
}
}
return 0;
}