Pagini recente » Cod sursa (job #2431259) | Cod sursa (job #784138) | Cod sursa (job #2582827) | Cod sursa (job #1095867) | Cod sursa (job #2955835)
#include <bits/stdc++.h>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
int n, m, sursa;
const int N = 500001;
vector <pair <int, int>> g[2 * N + 1];
int dist[N + 1], viz[N + 1], init[N + 1];
struct cmp
{
bool operator()(int l, int c)
{
return dist[l] >= dist[c];
}
};
priority_queue <int, vector <int>, cmp> pq;
void dijkstra(vector <pair <int, int>> g[2 * N + 1], int sursa)
{
dist[sursa] = 0;
pq.push(sursa);
viz[sursa] = 1;
while(!pq.empty())
{
int nod = pq.top();
pq.pop();
viz[nod] = 0;
for(int i = 0; i < g[nod].size(); i++)
{
int vecin = g[nod][i].first;
int cost = g[nod][i].second;
if(dist[nod] + cost < dist[vecin])
{
dist[vecin] = dist[nod] + cost;
if(!viz[vecin])
{
pq.push(vecin);
viz[vecin] = 1;
}
}
}
}
}
int main()
{
int t;
in >> t;
while(t--)
{
in >> n >> m >> sursa;
for(int i = 1; i <= n; i++)
in >> init[i];
for(int i = 1; i <= m; i++)
{
int a, b, c;
in >> a >> b >> c;
g[a].push_back({b, c});
g[b].push_back({a, c});
}
for(int i = 1; i <= n; i++)
dist[i] = INT_MAX;
dijkstra(g, sursa);
int ok = 0;
for(int i = 1; i <= n; i++)
{
if(dist[i] != init[i])
{
ok = 1;
break;
}
}
out << (ok ? "NU\n" : "DA\n");
memset(viz, 0, sizeof(viz));
}
return 0;
}