Pagini recente » Cod sursa (job #2737450) | Cod sursa (job #1487765) | Cod sursa (job #2970507) | Cod sursa (job #250903) | Cod sursa (job #2576710)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
struct edge{
int dest, dist;
};
class cmp
{
public:
bool operator() (edge a, edge b){
return a.dist > b.dist;
}
};
const int N = 50005, M = 10006, INF = (1 << 30) - 1;
int d[N], dist[N], n;
vector <edge> g[N];
priority_queue <edge, vector <edge>, cmp> q;
void citire(int n, int m)
{
for(int i = 1; i <= n; i++){
in >> dist[i];
}
for(int i = 0; i <= m; i++){
int a, b, c;
in >> a >> b >> c;
g[a].push_back(edge{b, c});
}
}
bool comparare()
{
for(int i = 1; i <= n; i++){
if(d[i] != dist[i]){
return false;
}
}
return true;
}
int main()
{
int T, a= 0;
in >> T;
while(a < T){
int m, p;
in >> n >> m >> p;
citire(n, m);
for(int i = 1; i <= n; i++){
d[i] = INF;
}
q.push(edge{p, 0});
while(!q.empty()){
edge t = q.top();
q.pop();
if(d[t.dest] == INF){
d[t.dest] = t.dist;
for(auto it: g[t.dest]){
q.push(edge{it.dest, it.dist + t.dist});
}
}
}
if(comparare()){
out << "DA" << "\n";
}
else{
out << "NU" << "\n";
}
a++;
}
return 0;
}