Pagini recente » Cod sursa (job #1759779) | Cod sursa (job #1098131) | Cod sursa (job #1415967) | Cod sursa (job #2466625) | Cod sursa (job #3203037)
// #include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");
const int NMAX = 50001;
const int INF = 1000000001;
auto cmp = [](pair<int, int>a, pair<int, int>b) {return a.first > b.first; };
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)>q(cmp);
vector<pair<int,int>>g[NMAX];
int viz[NMAX];
int drum[NMAX];
int drumFin[NMAX];
void dijkstra(int st)
{
drum[st] = 0;
q.push({ 0,st });
while (!q.empty())
{
pair<int, int>p=q.top();
q.pop();
if (viz[p.second])
continue;
viz[p.second] = 1;
for(auto x:g[p.second])
if (!viz[x.second] && drum[x.second] > drum[p.second] + x.first)
{
drum[x.second] = drum[p.second] + x.first;
q.push({ drum[x.second],x.second });
}
}
}
int main()
{
int t;
cin >> t;
for (int it = 0; it < t; it++)
{
int n, m, s;
bool ok = true;
cin >> n >> m >> s;
for (int i = 1; i <= n; i++)
cin >> drumFin[i];
for (int i = 0; i < m; i++)
{
int x, y, c;
cin >> x >> y >> c;
g[x].push_back({ c,y });
g[y].push_back({ c,x });
}
for (int i = 1; i <= n; i++)
drum[i] = INF, viz[i] = 0;
dijkstra(s);
for (int i = 2; i <= n; i++)
{
if (i > 1 && drum[i] == INF)
drum[i] = 0;
if (drum[i] != drumFin[i])
{
ok = false;
cout << "NU" << '\n';
break;
}
}
if (ok)
cout << "DA" << '\n';
for (int i = 1; i <= n; i++)
g[i].clear();
}
return 0;
}