Pagini recente » Cod sursa (job #3338313) | Cod sursa (job #860992) | Cod sursa (job #654833) | Cod sursa (job #702979) | Cod sursa (job #3354640)
// https://infoarena.ro/problema/distante
#include <bits/stdc++.h>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
const int INF = 1e9;
int main()
{
int t;
in >> t;
while(t--)
{
int n, m, source;
in >> n >> m >> source;
vector<int> dist(n + 1);
for(int i = 1; i <= n; i++)
{
in >> dist[i];
}
vector<vector<pair<int, int>>> a(n + 1);
for(int i = 1; i <= m; i++)
{
int x, y, c;
in >> x >> y >> c;
a[x].push_back({y, c});
a[y].push_back({x, c});
}
vector<int> d(n + 1, INF);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
d[source] = 0;
pq.push({0, source});
while(!pq.empty())
{
auto [distNode, node] = pq.top();
pq.pop();
if(distNode > d[node])
{
continue;
}
for(auto &[neigh, cost] : a[node])
{
if(d[neigh] > d[node] + cost)
{
d[neigh] = d[node] + cost;
pq.push({d[neigh], neigh});
}
}
}
int cnt = 0;
for(int i = 1; i <= n; i++)
{
if(d[i] == dist[i])
{
cnt++;
}
}
if(cnt == n)
{
out << "DA\n";
}
else
{
out << "NU\n";
}
}
return 0;
}