Pagini recente » Cod sursa (job #414722) | Cod sursa (job #483486) | Cod sursa (job #2120863) | Cod sursa (job #1240811) | Cod sursa (job #2276388)
#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++)
{
sol[i] = -1;
viz[i] = 0;
G[i].clear();
}
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 = 0; i < G[s].size(); i++)
{
H.push(G[s][i]);
sol[G[s][i].second] = G[s][i].first;
}
sol[s] = 0;
viz[s] = 1;
nr = G[s].size();
while (nr != 0)
{
x = H.size();
while (viz[H.top().second] == true)
{
H.pop();
}
viz[H.top().second] = true;
int c = H.top().second;
H.pop();
nr--;
for (int i = 0; i < G[c].size(); i++)
{
int j = G[c][i].second;
if (sol[j] == -1)
{
nr++;
sol[j] = sol[c] + G[c][i].first;
H.push(mp(sol[j], j));
}
else if (sol[j] > sol[c] + G[c][i].first)
{
sol[j] = sol[c] + G[c][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';
}
return 0;
}