Pagini recente » Cod sursa (job #1250934) | Cod sursa (job #867900) | Cod sursa (job #1052107) | Cod sursa (job #3172198) | Cod sursa (job #2134636)
#include <bits/stdc++.h>
using namespace std;
struct edge
{
int v, cost;
};
int T, nodes, edges, source, u, v, cost;
int D1[50001], D2[50001], OO = (1 << 31) - 1;
bool inQueue[50001];
vector<edge> adj[50001];
struct orderByDistance
{
bool operator()(int a,int b)
{
return D2[a] > D2[b];
}
};
priority_queue<int, vector<int>, orderByDistance> q;
void Dijkstra(int source)
{
for(int i = 1; i <= nodes; i++)
{
D2[i] = OO;
}
D2[source] = 0;
q.push(source);
inQueue[source] = true;
while(!q.empty())
{
int u = q.top(); q.pop();
inQueue[u] = false;
for(edge i : adj[u])
{
int v = i.v, cost = i.cost;
if(D2[v] > D2[u] + cost)
{
D2[v] = D2[u] + cost;
if(!inQueue[v])
{
q.push(v);
inQueue[v] = true;
}
}
}
}
}
bool check()
{
for(int i = 1; i <= nodes; i++)
{
if(D1[i] != D2[i]) return false;
}
return true;
}
int main(){
freopen("distante.in", "r", stdin);
freopen("distante.out", "w", stdout);
scanf("%d", &T);
while(T--)
{
scanf("%d %d %d", &nodes, &edges, &source);
for(int i = 1; i <= nodes; i++)
{
scanf("%d", &D1[i]);
}
for(int i = 1; i <= nodes; i++)
{
scanf("%d %d %d", &u, &v, &cost);
adj[u].push_back({v, cost});
adj[v].push_back({u, cost});
}
Dijkstra(source);
puts(check() ? "DA" : "NU");
for(int i = 1; i <= nodes; i++)
{
adj[i].clear();
}
}
return 0;
}