Pagini recente » Cod sursa (job #2919989) | Monitorul de evaluare | Cod sursa (job #1763651) | Cod sursa (job #222557) | Cod sursa (job #3198614)
#include <bits/stdc++.h>
using namespace std;
#define INFILE "distante.in"
#define OUTFILE "distante.out"
const int N_MAX = 5 * 1e4 + 5;
const int INF = 1e9;
struct Node {
int node;
int price;
Node() : node(0), price(0) {}
Node(int _node, int _price) : node(_node), price(_price) {}
bool operator<(const Node &other) const {
return (this -> price > other.price);
}
};
int nodes, edges, source;
vector<Node> adj[N_MAX];
int expected[N_MAX];
int dist[N_MAX];
void djikstra(int source){
for(int i = 1; i <= nodes; ++i) dist[i] = INF;
dist[source] = 0;
priority_queue<Node> q;
q.push(Node(source, 0));
while(!q.empty()){
int node = q.top().node;
int price = q.top().price;
q.pop();
if(price != dist[node]) continue;
for(int i = 0; i < adj[node].size(); ++i){
Node to = adj[node][i];
if(price + to.price < dist[to.node]){
dist[to.node] = price + to.price;
q.push(Node(to.node, dist[to.node]));
}
}
}
}
void solve(){
memset(expected, 0, sizeof expected);
adj->clear();
cin >> nodes >> edges >> source;
for(int i = 1; i <= nodes; ++i){
cin >> expected[i];
}
for(int i = 0; i < edges; ++i){
int node1, node2, price; cin >> node1 >> node2 >> price;
adj[node1].push_back(Node(node2, price));
}
djikstra(source);
bool ok = true;
for(int i = 1; i <= nodes && ok; ++i){
if(dist[i] != expected[i]) ok = false;
}
cout << (ok == true ? "YES" : "NO") << '\n';
}
int main(){
ios_base::sync_with_stdio(false);
freopen(INFILE, "r", stdin);
freopen(OUTFILE, "w", stdout);
cin.tie(0), cout.tie(0);
int tests; cin >> tests;
for(int i = 0; i < tests; ++i) solve();
return 0;
}