Pagini recente » Cod sursa (job #2883207) | Cod sursa (job #1442689) | Cod sursa (job #427770) | Cod sursa (job #2616306) | Cod sursa (job #72112)
Cod sursa(job #72112)
using namespace std;
#include <cstdio>
#include <vector>
#include <string>
#include <queue>
#define oo 0x3f3f3f3f
#define maxn 50001
#define pb push_back
struct nod { int n, c;nod(){}; nod(int a, int b){n=a; c=b;};};
vector<vector<nod> >a;
int d[maxn];
bool viz[maxn];
struct cmp{
bool operator()(const int &a, const int &b)const
{
if(d[a]>d[b]) return 1;
return 0;
}
};
int n, m, d1[maxn],source;
void dijkstra()
{
priority_queue<int, vector<int>, cmp>Q;
memset(d, oo, sizeof(d));
memset(viz, 0, sizeof(viz));
d[source]=0;
Q.push(source);
vector<nod>::iterator i;
int u;
int nh=n;
while(!Q.empty() && nh)
{
u=Q.top();
Q.pop();
if(viz[u]) continue;
--nh;
viz[u]=1;
for(i=a[u].begin();i!=a[u].end();++i)
if(d[u]+i->c<d[i->n])
d[i->n]=d[u]+i->c,
Q.push(i->n);
}
}
int main()
{
int T,p, q, c,i;
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d\n", &T);
while(T--)
{
scanf("%d %d %d\n",&n, &m, &source);
a.clear();
a.resize(n+1);
for(i=1;i<=n;++i) scanf("%d ", d1+i);
while(m--)
{
scanf("%d %d %d\n", &p, &q, &c);
a[p].pb(nod(q, c));
a[q].pb(nod(p, c));
}
dijkstra();
int ok=1;
for(i=1;i<=n;++i)
if(d[i]!=d1[i]) { ok=0; break;}
if(ok)printf("DA\n");
else printf("NU\n");
}
return 0;
}