Pagini recente » Cod sursa (job #2229158) | Cod sursa (job #868724) | Cod sursa (job #742675) | Istoria paginii runda/vlad_oji2/clasament | Cod sursa (job #1426913)
#include <stdio.h>
#include <vector>
#include <set>
#define NMAX 50001
#define INF 0x7FFFFFFF
using namespace std;
int n, m, t, start, allGood, currNode, currDist;
int intrare[NMAX], iesire[NMAX];
vector< pair<int, int> > graf[NMAX];
set< pair<int, int> > heap;
void dijkstra() {
for(int i = 1; i <= n; ++i) iesire[i] = INF;
iesire[start] = 0;
heap.insert(make_pair(start, 0));
while(heap.size()) {
currNode = (*heap.begin()).first;
currDist = (*heap.begin()).second;
heap.erase((*heap.begin()));
for(int i = 0; i < graf[currNode].size(); ++i) {
if(iesire[graf[currNode][i].first] > currDist + graf[currNode][i].second) {
iesire[graf[currNode][i].first] = currDist + graf[currNode][i].second;
heap.insert(make_pair(graf[currNode][i].first, iesire[graf[currNode][i].first]));
}
}
}
}
int main() {
freopen("distante.in", "r", stdin);
freopen("distante.out", "w", stdout);
int x, y, c;
scanf("%d", &t);
while(t--) {
for(int i = 1; i <= n; ++i) {
graf[i].clear();
}
heap.clear();
scanf("%d%d%d", &n, &m, &start);
for(int i = 1; i <= n; ++i) {
scanf("%d", &intrare[i]);
}
for(int i = 0; i < m; ++i) {
scanf("%d%d%d", &x, &y, &c);
graf[x].push_back(make_pair(y, c));
graf[y].push_back(make_pair(x, c));
}
dijkstra();
allGood = 1;
for(int i = 1; i <= n; ++i) {
if(intrare[i] != iesire[i]) {
allGood = 0;
break;
}
}
printf("%s\n", allGood ? "YES" : "NO");
}
return 0;
}