Pagini recente » Monitorul de evaluare | Profil Bot32 | Borderou de evaluare (job #1780098) | Cod sursa (job #1416174) | Cod sursa (job #3355373)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
void dijsktra(int source, vector<vector<pair<int, int>>>& adj, vector<int>& dist) {
fill(dist.begin(), dist.end(), 1e9);
dist[source] = 0;
// dist_pana_la_nod si nod
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
pq.push({0, source});
while (!pq.empty()) {
int distance = pq.top().first;
int node = pq.top().second;
pq.pop();
if (distance > dist[node]) {
continue;
}
for (auto edge : adj[node]) {
int neigh = edge.first;
int cost = edge.second;
if (distance + cost < dist[neigh]) {
dist[neigh] = distance + cost;
pq.push({dist[neigh], neigh});
}
}
}
for (int i = 1; i < dist.size(); i++) {
if (dist[i] == 1e9) {
dist[i] = -1;
}
}
}
int main() {
int T;
fin >> T;
for (int k = 0; k < T; k++) {
int N, M, S;
fin >> N >> M >> S;
vector<int> verif(N + 1);
for (int i = 1; i <= N; i++) {
fin >> verif[i];
}
vector<vector<pair<int, int>>> adj(N + 1);
for (int i = 1; i <= M; i++) {
int a, b, cost;
fin >> a >> b >> cost;
adj[a].push_back({b, cost});
adj[b].push_back({a, cost});
}
vector<int> dist(N + 1);
dijsktra(S, adj, dist);
// daca gasesc vreo diferenta fata de verif, afisez nu
int found = 0;
for (int i = 1; i <= N; i++) {
if (dist[i] != verif[i]) {
found = 1;
}
}
if (found == 0) {
fout << "DA\n";
} else {
fout << "NU\n";
}
}
return 0;
}