Pagini recente » Cod sursa (job #109602) | Cod sursa (job #1141111) | Cod sursa (job #2720192) | Cod sursa (job #3289257) | Cod sursa (job #2604588)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int VMAX = 100005;
const int INF = 1 << 30;
vector< pair <int, int> > graf[VMAX];
vector<int> D(VMAX), DNV(VMAX);
vector<bool> inq(VMAX);
int n, m, s;
struct compare{bool operator()(int i, int j){return D[i] > D[j];}};
priority_queue<int, vector<int>, compare> q;
void Dijkstra(int startnode)
{
for (int i = 1; i <= n; ++i) D[i] = INF;
D[startnode] = 0;
q.push(startnode);
inq[startnode] = true;
while (!q.empty())
{
int nod = q.top();
q.pop();
inq[nod] = false;
for (size_t i = 0; i < graf[nod].size(); ++i)
{
if (D[nod] + graf[nod][i].second < D[graf[nod][i].first])
{
D[graf[nod][i].first] = D[nod] + graf[nod][i].second;
if (!inq[graf[nod][i].first])
{
q.push(graf[nod][i].first);
inq[graf[nod][i].first] = true;
}
}
}
}
}
int main()
{
ios_base::sync_with_stdio(false);
fin.tie(NULL), fout.tie(NULL);
int t;
fin >> t;
while (t--)
{
int x, y, c;
fin >> n >> m >> s;
for (int i = 1; i <= n; ++i)
fin >> DNV[i];
for (int i = 1; i <= m; ++i)
{
fin >> x >> y >> c;
graf[x].push_back({y, c});
}
Dijkstra(s);
int nono = true;
for (int i = 1; i <= n; ++i)
if (DNV[i] != D[i]) nono = false;
if (!nono) fout << "NU\n";
else fout << "DA\n";
}
fin.close(), fout.close();
return 0;
}