Pagini recente » Cod sursa (job #2395854) | Cod sursa (job #2677281) | Cod sursa (job #1709126) | Cod sursa (job #457670) | Cod sursa (job #2276392)
#include <bits/stdc++.h>
#define mama pair <int, int>
#define NMax 50005
#define mp make_pair
using namespace std;
ifstream f ("distante.in");
ofstream g ("distante.out");
vector <mama> G[NMax];
priority_queue <mama, vector <mama>, greater<mama> > H;
int t, n, m, s, x, y, c, nr;
long long brsol[NMax];
long long sol[NMax];
bool viz[NMax];
int main()
{
f >> t;
for (; t; t--)
{
f >> n >> m >> s;
for (int i = 1; i <= n; i++)
f >> brsol[i];
for (int i = 1; i <= m; i++)
{
f >> x >> y >> c;
G[x].push_back(mp(c, y));
G[y].push_back(mp(c, x));
}
for (int i = 1; i <= n; i++) {
viz[i] = false;
sol[i] = -1;
}
for (int i = 0; i < G[s].size(); i++)
{
H.push(G[s][i]);
sol[G[s][i].second] = G[s][i].first;
}
nr = G[s].size();
sol[s] = 0;
while (nr != 0)
{
while (viz[H.top().second] == true)
{
H.pop();
}
viz[H.top().second] = true;
int t = H.top().second;
H.pop();
nr--;
for (int i = 0; i < G[t].size(); i++)
{
int j = G[t][i].second;
if (sol[j] == -1)
{
nr++;
sol[j] = sol[t] + G[t][i].first;
H.push(mp(sol[j], j));
}
else if (sol[j] > sol[t] + G[t][i].first)
{
sol[j] = sol[t] + G[t][i].first;
H.push({sol[j], j});
}
}
}
bool ok = true;
for (int i = 1; i <= n && ok == true; i++)
{
if (sol[i] != brsol[i])
{
ok = false;
}
}
if (ok == false) g << "NU" << '\n';
else g << "DA" << '\n';
for (int i = 1; i <= n; i++)
G[i].clear();
}
return 0;
}