Mai intai trebuie sa te autentifici.
Cod sursa(job #3227044)
Utilizator | Data | 24 aprilie 2024 17:36:31 | |
---|---|---|---|
Problema | Distante | Scor | 0 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 1.71 kb |
#include <bits/stdc++.h>
#define Nmax 50001
#define INF 1 << 30
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int n, m, s;
vector<pair<int, int>> G[Nmax];
int dist[Nmax];
int viz[Nmax];
int dist_prob[Nmax];
struct compare {
bool operator() (int a, int b) {
return dist[a] > dist[b];
}
};
void Dijkstra(int start) {
priority_queue<int , vector<int>, compare> Q;
viz[start] = 1;
dist[start] = 0;
Q.push(start);
while(!Q.empty()) {
int nod = Q.top();
viz[nod] = 0;
Q.pop();
for (auto it: G[nod]) {
int vecin = it.first;
int cost = it.second;
if (dist[nod] + cost < dist[vecin]) {
dist[vecin] = dist[nod] + cost;
if (!viz[vecin]) {
Q.push(vecin);
viz[vecin] = 1;
}
}
}
}
}
int main() {
short int t;
fin >> t;
for (int i = 1; i <= t; i ++) {
fin >> n >> m >> s;
for (int i = 1; i <= n; i ++)
fin >> dist_prob[i];
while(m -- ) {
int x, y, cost;
fin >> x >> y >> cost;
G[x].push_back({y, cost});
G[y].push_back({x, cost});
}
for (int i = 1; i <= n; i ++)
dist[i] = INF, viz[i] = 0;
Dijkstra(s);
int ok = 1;
for (int i = 1; i <= n; i ++) {
if (dist[i] != dist_prob[i]) {
ok = 0;
fout << "NU" << '\n';
break;
}
}
if (ok)
fout << "DA" << '\n';
}
}