Pagini recente » Cod sursa (job #407949) | Cod sursa (job #1647866) | Cod sursa (job #1396483) | Cod sursa (job #1672920) | Cod sursa (job #461726)
Cod sursa(job #461726)
#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;
}*v[DN];
void adaugare (int x, int y, int cost) {
nod *p;
p=new nod;
p->x=y;
p->cost=cost;
p->urm=v[x];
v[x]=p;
}
bool verifica(int sursa) {
int i,ver[DN];
nod *p;
memset(ver,0,sizeof(ver));
for(i=1; i<=n; i++)
for(p=v[i];p!=NULL; p=p->urm) if(cdist[i]==cdist[p->x]+p->cost) ver[i]=1;
for(i=1; i<=n; i++)
if(!ver[i] && i!=sursa) return false;
return true;
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int i,j,t,sursa,x,y,c;
scanf("%d",&t);
for(i=1; i<=t; i++) {
scanf("%d %d %d",&n ,&m,&sursa);
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);
adaugare(y,x,c);
}
if(verifica(sursa)) printf("DA\n");
else printf("NU\n");
}
return 0;
}