Cod sursa(job #461718)
#include <cstdio>
#include <cstring>
#include <deque>
using namespace std;
#define DN 50001
#define INFI 0x3f3f3f3f
int viz[DN],dist[DN],n,m,cdist[DN];
deque <int> coada;
struct nod {
int x,cost;
nod *urm;
};
void adaugare (int x, int y, int cost,nod *v[DN]) {
nod *p;
p=new nod;
p->x=y;
p->cost=cost;
p->urm=v[x];
v[x]=p;
}
void initializareSU(int sursa,nod *v[DN]) {
int i;
for(i=1; i<=n; i++) viz[i]=0, dist[i]=INFI;
dist[sursa]=0;
viz[sursa]=1;
coada.push_back(sursa);
}
void bellman_ford(nod *v[DN]) {
nod *p;
int i;
for( ; coada.size(); coada.pop_front()) {
//viz[coada.front()]=0;
for(p=v[coada.front()]; p!=NULL; p=p->urm)
if(dist[p->x]>dist[coada.front()]+p->cost) {//relaxare
dist[p->x]=dist[coada.front()]+p->cost;
if(!viz[p->x]) {
coada.push_back(p->x);
//viz[p->x]=1;
}
}
}
for(i=1; i<=n; i++) if(dist[i]!=cdist[i]) {
printf("NU\n");
return;
}
printf("DA\n");
}
void rezolva(int sursa) {
int j,x,y,c;
nod *v[DN];
initializareSU(sursa,v);
for(j=1; j<=n; j++) scanf("%d",&cdist[j]);
for(j=1; j<=m; j++) {
scanf("%d %d %d",&x ,&y ,&c );
adaugare(x,y,c,v);
adaugare(y,x,c,v);
}
bellman_ford(v);
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int i,t,sursa;
scanf("%d",&t);
for(i=1; i<=t; i++) {
scanf("%d %d %d",&n ,&m,&sursa);
rezolva(sursa);
}
return 0;
}