Pagini recente » Cod sursa (job #2792892) | Cod sursa (job #8235) | Cod sursa (job #2572892) | Cod sursa (job #2854417) | Cod sursa (job #2650914)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
vector <pair <int, int>> v[50001];
struct el
{
int c, nod;
bool operator <(const el &alt) const
{
return c > alt.c;
}
};
priority_queue <el> p;
int d[50001];
bool b[50001];
int ver[50001];
int main()
{
int t, q;
int n, m, s, i, j, x, y, z;
fin >> t;
for (q = 1; q<=t; q++)
{
fin >> n >> m >> s;
for (i = 1; i<=n; i++)
{
v[i].clear();
d[i] = 1<<30;
b[i] = 0;
}
while (p.empty() == 0)
p.pop();
for (i = 1; i<=n; i++)
fin >> ver[i];
for (i = 1; i<=m; i++)
{
fin >> x >> y >> z;
v[x].push_back({y, z});
v[y].push_back({x, z});
}
d[s] = 0;
p.push({0, s});
for (i = 1; i<n; i++)
{
while (p.empty() == 0 && b[p.top().nod])
p.pop();
if (p.empty() == 1)
break;
x = p.top().nod;
p.pop();
b[x] = 1;
for (j = 0; j<v[x].size(); j++)
if (d[v[x][j].first] > d[x] + v[x][j].second)
{
d[v[x][j].first] = d[x] + v[x][j].second;
p.push({d[v[x][j].first], v[x][j].first});
}
}
for (i = 1; i<=n && ver[i] == d[i]; i++);
if (i <= n)
fout << "NU\n";
else
fout << "DA\n";
}
return 0;
}