Pagini recente » Cod sursa (job #2816879) | Cod sursa (job #21468) | Cod sursa (job #2057483) | Cod sursa (job #3274940) | Cod sursa (job #3241346)
#include <bits/stdc++.h>
const std :: string FILENAME = "distante";
std :: ifstream in (FILENAME + ".in");
std :: ofstream out (FILENAME + ".out");
const int NMAX = 5e4 + 5;
const int INF = 1e9;
int t;
int n;
int m;
int s;
int x;
int y;
int d;
bool ok;
int dist[NMAX];
int dp[NMAX];
std :: vector <std :: pair <int, int>> v[NMAX];
std :: priority_queue <std :: pair <int, int>> pq;
std :: bitset <NMAX> visited;
void dijkstra()
{
while(!pq.empty())
{
int nod = pq.top().second;
pq.pop();
if(visited[nod] == false)
{
visited[nod] = true;
for(auto & i : v[nod])
{
if(dp[nod] + i.second < dp[i.first])
{
dp[i.first] = dp[nod] + i.second;
pq.push(std :: make_pair(-dp[i.first], i.first));
}
}
}
}
}
int main()
{
in >> t;
while(t --)
{
in >> n >> m >> s;
for(int i = 1; i <= n; i ++)
{
v[i].clear();
in >> dist[i];
}
visited &= 0;
for(int i = 1; i <= m; i ++)
{
in >> x >> y >> d;
v[x].push_back(std :: make_pair(y, d));
v[y].push_back(std :: make_pair(x, d));
}
std :: fill(dp + 1, dp + n + 1, INF);
dp[s] = 0;
pq.push(std :: make_pair(0, s));
dijkstra();
ok = true;
for(int i = 1; i <= n; i ++)
{
if(dp[i] != dist[i])
{
out << "NU" << '\n';
ok = false;
break;
}
}
if(ok)
{
out << "DA" << '\n';
}
}
return 0;
}