Pagini recente » Cod sursa (job #992872) | Cod sursa (job #2840193) | Cod sursa (job #1316244) | Cod sursa (job #1354063) | Cod sursa (job #1402096)
#include <fstream>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include<cstring>
using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");
const int o=50005, inf=999999999;
typedef struct Celula{
int nod, cost;
Celula *next;
}*Lista;
Lista lda[o], r;
int a, b, c, S, i, j, L, k, t, n, m, D[o], H[o], C[o];
void Add(int b, int c, Lista &y){
Lista p=new Celula;
p->nod=b;
p->cost=c;
p->next=y;
y=p;
}
inline void Up(int k){
if (k>1 && D[H[k]]<D[H[k/2]])
{
swap(H[k], H[k/2]);
Up(k/2);
}
}
inline void Down(int k){
int x=k, st=k*2, dr=k*2+1;
if (st<=L && D[H[st]]<D[H[x]]) x=st;
if (dr<=L && D[H[dr]]<D[H[x]]) x=dr;
if(k!=x){
swap(H[k], H[x]);
Down(x);
}
}
int main()
{
cin>>t;
while (t--)
{
cin>>n>>m>>S;
for(i=1; i<=n; ++i) cin>>C[i];
for(i=1; i<=n; ++i) lda[i]=NULL;
for(i=1; i<=m; ++i)
cin>>a>>b>>c,
Add(a, c, lda[b]),
Add(b, c, lda[a]);
L=1;
for(i=1; i<=n; ++i) D[i]=inf;
D[S]=0;
H[1]=S;
while (L){
k=H[1];
r=lda[k];
H[1]=H[L];
--L; Down(1);
while (r){
if(D[k]+r->cost < D[r->nod])
{
D[r->nod]=D[k]+r->cost;
H[++L]=r->nod;
Up(L);
}
r=r->next;
}
}
bool u=1;
for(i=1; i<=n && u; ++i)
if (D[i]!=C[i]) u=0;
if (u) cout<<"DA\n";
else cout<<"NU\n";
}
return 0;
}