Pagini recente » Cod sursa (job #168748) | Cod sursa (job #1761325) | Cod sursa (job #85896) | Cod sursa (job #904964) | Cod sursa (job #2040652)
#include <bits/stdc++.h>
using namespace std;
struct cmp
{
cmp(){}
bool operator()(const pair<int, int>& a, const pair<int, int>& b) const
{
return a.first > b.first;
}
};
vector< pair<int, int> > v[50001];
bool viz[50001];
int dist[50001];
int odist[50001];
priority_queue< pair<int, int>, vector< pair<int, int> >, cmp> q;
int n, m, s;
bool solve()
{
viz[s] = 1;
if(odist[s] != 0) return false;
dist[s] = 0;
while(!q.empty()) q.pop();
for(int i = 0; i < v[s].size(); i++)
q.push(v[s][i]);
while(!q.empty())
{
pair<int, int> p = q.top();
q.pop();
if(viz[p.second]) continue;
if(odist[p.second] != p.first)
return false;
viz[p.second] = 1;
for(int i = 0; i < v[p.second].size(); i++)
{
if(!viz[v[p.second][i].second] &&
dist[v[p.second][i].second] > p.first + v[p.second][i].first)
{
int d = p.first + v[p.second][i].first;
dist[v[p.second][i].second] = d;
pair<int, int> np = make_pair(d, v[p.second][i].second);
q.push(np);
}
}
}
return true;
}
int main()
{
freopen("distante.in", "r", stdin);
freopen("distante.out", "w", stdout);
int t, a, b,c;
scanf("%d", &t);
while(t--)
{
scanf("%d%d%d", &n, &m, &s);
s--;
for(int i = 0; i < n; i++)
{
scanf("%d", &odist[i]);
dist[i] = 0x3f3f3f3f;
v[i].clear();
viz[i] = 0;
}
for(int i = 0; i < m; i++)
{
scanf("%d%d%d", &a, &b, &c);
a--; b--;
v[a].push_back(make_pair(c, b));
v[b].push_back(make_pair(c, a));
}
if(solve())
printf("DA\n");
else printf("NU\n");
}
return 0;
}