Pagini recente » Cod sursa (job #976704) | Cod sursa (job #1842454) | Cod sursa (job #1633024) | Cod sursa (job #1923551) | Cod sursa (job #3212265)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int NMAX = 50005;
const int INF = 0x3f3f3f3f;
int T;
int dist[NMAX], distAUX[NMAX];
int n, m, S;
vector<pair<int, int>>g[NMAX];
void Dijkstra(int start) {
for (int i = 1; i <= n; ++i)
distAUX[i] = INF;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>pq;
distAUX[start] = 0;
pq.push({ 0,start });
while (!pq.empty()) {
int nod = pq.top().second;
int distanta = pq.top().first;
pq.pop();
for (auto i : g[nod]) {
int distanta_nod = i.first;
int nod_urm = i.second;
if (distanta + distanta_nod < distAUX[nod_urm]) {
distAUX[nod_urm] = distanta + distanta_nod;
pq.push({ distanta + distanta_nod,nod_urm });
}
}
}
}
int main() {
fin >> T;
while (T--) {
memset(dist, 0, sizeof(dist));
memset(distAUX, 0, sizeof(distAUX));
for (int i = 0; i < NMAX; ++i)
g[i].clear();
fin >> n >> m >> S;
for (int i = 1; i <= n; ++i)
fin >> dist[i];
for (int i = 1; i <= m; ++i) {
int x, y, c;
fin >> x >> y >> c;
g[x].push_back({ c,y });
g[y].push_back({ c,x });
}
Dijkstra(S);
bool ok = true;
for (int i = 1; i <= n; ++i)
if (dist[i] != distAUX[i]) {
ok = false;
break;
}
if (!ok)
fout << "NU" << "\n";
else fout << "DA" << "\n";
}
return 0;
}