Pagini recente » Cod sursa (job #2694322) | Cod sursa (job #818377) | Cod sursa (job #3131321) | Cod sursa (job #2580311) | Cod sursa (job #2606411)
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
#include <tuple>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int md[100005], dst[100005];
bool viz[100005];
int t, n, m, s;
vector<tuple<int, int> >vp[100005];
void dijkstra(int x)
{
for (int i = 1; i <= n; i++) {
dst[i] = 0x3f3f3f3f;
viz[i] = 0;
}
dst[x] = 0;
priority_queue<tuple<int, int>>pq;//qw,a
pq.push({ 0,x });
while (!pq.empty())
{
int a = get<1>(pq.top());
pq.pop();
if (viz[a])
continue;
for (auto& it : vp[a])
{
int b, w;
tie(b, w) = it;
if (dst[a] + w < dst[b]) {
dst[b] = dst[a] + w;
pq.push({ -dst[b], b });
}
}
viz[a] = 1;
}
}
int main()
{
ios::sync_with_stdio(false);
fin >> t;
for (int k = 0; k < t; k++)
{
fin >> n >> m >> s;
for (int i = 1; i <= n; i++)
{
fin >> md[i];
}
int a, b, w;
for (int i = 0; i < m; i++)
{
fin >> a >> b >> w;
vp[a].push_back({ b,w });
vp[b].push_back({ a,w });
}
dijkstra(s);
bool out = 1;
for (int i = 1; i <= n; i++)
{
//cout << dst[i] << ' ';
if (dst[i] != md[i]) {
out = 0;
}
}
//cout << '\n';
if (out == 1)
fout << "DA\n";
else
fout << "NU\n";
for (int i = 1; i <= n; i++)
vp[i].clear();
}
}