Pagini recente » Cod sursa (job #1635408) | Cod sursa (job #99928) | Cod sursa (job #1672713) | Cod sursa (job #2373536) | Cod sursa (job #2397350)
#include <bits/stdc++.h>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
const int N = 50000;
const int M = 100000;
const int INF = 2000000000;
int T, n, m, ns, a, b, c;
int dd[N + 5], d[N + 5];
bool viz[N + 5];
struct xyc
{
int vecin, cost;
};
vector<xyc> v[N + 5];
struct compare
{
bool operator() (int x, int y)
{
return d[x] > d[y];
}
};
priority_queue<int, vector<int>, compare> q;
void BFS(int ns)
{
q.push(ns);
d[ns] = 0;
while (!q.empty())
{
int nod = q.top();
q.pop();
viz[nod] = false;
for (vector<xyc> :: iterator it = v[nod].begin(); it != v[nod].end(); ++it)
{
int vecin = it -> vecin;
int cost = it -> cost;
if (d[vecin] > d[nod] + cost)
{
d[vecin] = d[nod] + cost;
if (viz[vecin] == false)
{
viz[vecin] = true;
q.push(vecin);
}
}
}
}
}
int main()
{
in>>T;
while (T--)
{
for (int i = 1;i <= n;++i) v[i].clear();
while (!q.empty()) q.pop();
memset(viz, 0, sizeof viz);
in>>n>>m>>ns;
for (int i = 1; i <= n; ++i)
{
in>>dd[i];
d[i] = INF;
}
for (int i = 1; i <= m; ++i)
{
in>>a>>b>>c;
v[a].push_back({b, c});
}
BFS(ns);
bool ok = true;
for (int i = 1; i <= n; ++i)
if (d[i] != dd[i]) {ok = false; break;}
if (ok == true) out<<"DA\n";
else out<<"NU\n";
}
return 0;
}