Pagini recente » Cod sursa (job #680817) | Cod sursa (job #2369684) | Cod sursa (job #3240484) | Cod sursa (job #2106654) | Cod sursa (job #3201859)
#include <iostream>
#include <fstream>
#include <queue>
#define oo 2000000005
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
vector<pair<int, int>>h[50001];///lista de adiacenta cost,nod
priority_queue<pair<int, int>>q;
bool viz[50001];///Verific daca am gasit costul minim de la P la i
int dijk[50001];///Costum minim de la P la dijk[i]
int brnzn[50001];///Costul lui Bronzel
int t, n, m, p;
void Dijkstra(int P)
{
int i, k, c;
for (i = 1; i <= n; i++)
{
dijk[i] = oo;
viz[i] = 0;
}
dijk[P] = 0;
q.push(make_pair(0, P));
while (!q.empty())
{
k = q.top().second;
q.pop();
if (viz[k] == 0)
{
viz[k] = 1;
for (auto w : h[k])
{
i = w.second;
c = w.first;
if (dijk[i] > dijk[k] + c)
{
dijk[i] = dijk[k] + c;
q.push(make_pair(-dijk[i], i));
}
}
}
}
}
int main()
{
int i, k, a, b, c;
bool ok = 1;
fin >> t;
for (k = 1; k <= t; k++)
{
ok = 1;
fin >> n >> m >> p;
for (i = 1; i <= n; i++)fin >> brnzn[i];
for (i = 1; i <= m; i++)
{
fin >> a >> b >> c;
h[b].push_back(make_pair(c, a));
h[a].push_back(make_pair(c, b));
}
Dijkstra(p);
/*
for (i = 1; i <= n; i++)
fout << dijk[i] << " ";
fout << "\n";
*/
for (i = 1; i <= n; i++)
if (dijk[i] != brnzn[i])
{
ok = 0;
break;
}
if (ok == 0)fout << "NU\n";
else fout << "DA\n";
}
return 0;
}