Pagini recente » Cod sursa (job #1644856) | Cod sursa (job #505945) | Monitorul de evaluare | Arhiva de probleme | Cod sursa (job #2869844)
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
std::ifstream in("distante.in");
std::ofstream out("distante.out");
constexpr int INF = 1e9+1;
constexpr int N = 5e4+2;
int dist[N];
struct node{
int v, cost;
};
std::vector<node> g[N];
void clearVect(int n){
for(int i=1; i<=n; ++i)
g[i].clear();
}
bool dijkstra(int source, int n){
std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, std::greater<std::pair<int, int>>> heap;
std::bitset<N> selected;
int currDist[N];
for(int i=1; i<=n; ++i)
currDist[i] = INF;
currDist[source] = 0;
heap.push({0, source});
int cnt = 0;
while(!heap.empty()){
int u = heap.top().second;
heap.pop();
if(selected[u]) continue;
selected[u] = true;
++cnt;
if(dist[u] != currDist[u]) return false;
for(auto branch : g[u]){
int v = branch.v;
int cost = branch.cost;
if(currDist[u] + cost < currDist[v]){
currDist[v] = currDist[u] + cost;
heap.push({currDist[v], v});
}
}
}
return cnt == n;
}
int main(){
int t;
in >> t;
while(t--){
int n, m, source;
in >> n >> m >> source;
for(int i=1; i<=n; ++i)
in >> dist[i];
for(int i=0; i<m; ++i){
int u, v, cost;
in >> u >> v >> cost;
g[u].push_back({v, cost});
g[v].push_back({u, cost});
}
bool res = dijkstra(source, n);
if(res) out << "DA";
else out << "NU";
out << '\n';
clearVect(n);
}
return 0;
}