Pagini recente » Cod sursa (job #1508262) | Cod sursa (job #2603418) | Cod sursa (job #2738918) | Cod sursa (job #743434) | Cod sursa (job #2641698)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int t, n, m, s, a, b, c;
bool Dijkstra(vector <vector <pair <int, int> > > &G, vector <int> &dist, int s){
vector <int> dp(n + 1, 1e9);
set <pair <int, int> > heap;
heap.insert({0, s});
dp[s] = 0;
while (heap.size()){
auto it = heap.begin();
int cost = (*it).first;
int nod = (*it).second;
heap.erase(it);
if (dp[nod] != dist[nod]) return false;
for (auto vecin : G[nod]){
if (cost + vecin.second < dp[vecin.first]){
if (dp[vecin.first] != 1e9) heap.erase(heap.find({dp[vecin.first], vecin.first}));
dp[vecin.first] = cost + vecin.second;
heap.insert({dp[vecin.first], vecin.first});
}
}
}
return true;
}
int main(){
fin >> t;
while (t--){
fin >> n >> m >> s;
vector <int> dist(n + 1);
for (int i = 1; i <= n; ++i) fin >> dist[i];
vector <vector <pair <int, int> > > G(n + 1);
for (int i = 1; i <= m; ++i){
fin >> a >> b >> c;
G[a].push_back({b, c});
G[b].push_back({a, c});
}
if (Dijkstra(G, dist, s)) fout << "DA\n";
else fout << "NU\n";
}
return 0;
}