Pagini recente » Cod sursa (job #1249048) | Cod sursa (job #174745) | Cod sursa (job #233546) | Cod sursa (job #1273223) | Cod sursa (job #2823464)
#include <bits/stdc++.h>
#define nmax 100003
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int n, m, s;
vector<int> b;
vector< pair<int, int> > h[nmax];
void dijkstra(int &start, vector<int> &d, vector<bool> &in_coada)
{
int k, v, c;
priority_queue< pair<int, int>, vector< pair<int, int> >, greater< pair<int, int> > > coada_muchii;
coada_muchii.push({d[start], start});
while(!coada_muchii.empty())
{
k = coada_muchii.top().second;
coada_muchii.pop();
in_coada[k] = false;
for (auto w : h[k])
{
v = w.first;
c = w.second;
if(d[v] > d[k] + c)
{
d[v] = d[k] + c;
if(!in_coada[v])
{
coada_muchii.push({d[v], v});
in_coada[v] = true;
}
}
}
}
}
bool pb_dijkstra(int start)
{
vector<int> d(nmax);
vector<bool> in_coada(nmax);
for (int i = 1; i <= n; i++)
d[i] = 1e9;
d[start] = 0;
dijkstra(start, d, in_coada);
for(int i = 1; i <= n; i++)
if(b[i] != d[i])
return false;
return true;
}
void hb_init()
{
b.clear();
for(int i = 1; i <= nmax; i++)
h[i].clear();
}
int main()
{
int q, x, y, c;
fin >> q;
while(q--)
{
fin >> n >> m >> s;
b.push_back(-1);
for(int i = 1; i <= n; i++)
{
fin >> x;
b.push_back(x);
}
for(int i = 1; i <= m; i++)
{
fin >> x >> y >> c;
h[x].push_back({y, c});
h[y].push_back({x, c});
}
if(pb_dijkstra(s)) fout << "DA\n";
else fout << "NU\n";
hb_init();
}
fin.close();
fout.close();
return 0;
}