Pagini recente » Cod sursa (job #784571) | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #1326800) | Cod sursa (job #3328044)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 50000;
const long long INF = 2e18;
int t,n,m,s;
long long dist[NMAX+1];
vector<pair<int,int>>v[NMAX+1];
long long dist_azorel[NMAX+1];
void dijkstra(int nod)
{
for (int i = 1; i <= n; i++)
dist[i] = INF;
dist[nod] = 0;
set<pair<long long,int>>s;
s.insert({0,nod});
while (!s.empty())
{
int nod_curr = (*s.begin()).second;
long long cost_curr = (*s.begin()).first;
s.erase(s.begin());
if (cost_curr != dist[nod_curr])continue;
for (pair<int,int> i : v[nod_curr])
{
int nod_urm = i.first;
int cost_urm = i.second;
if (dist[nod_curr] + cost_urm < dist[nod_urm])
{
auto it = s.find({dist[nod_urm],nod_urm});
dist[nod_urm] = dist[nod_curr] + cost_urm;
if (it != s.end())s.erase(it);
s.insert({dist[nod_urm],nod_urm});
}
}
}
}
void solve()
{
for (int i = 1; i <= n; i++)
v[i].clear();
cin >> n >> m >> s;
for (int i = 1; i <= n; i++)
cin >> dist_azorel[i];
for (int i = 1; i <= m; i++)
{
int st,dr,c;
cin >> st >> dr >> c;
v[st].push_back({dr,c});
v[dr].push_back({st,c});
}
dijkstra(s);
for (int i = 1; i <= n; i++)
if (dist[i] != dist_azorel[i])
{
cout << "NU\n";
return;
}
cout << "DA\n";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> t;
while (t--)
solve();
return 0;
}