Pagini recente » Cod sursa (job #1534260) | Cod sursa (job #1833453) | Cod sursa (job #1904276) | Cod sursa (job #909434) | Cod sursa (job #294173)
Cod sursa(job #294173)
#include<stdio.h>
#include<queue>
#define INF 1000000
using namespace std;
struct nod{
int nd;
int cost;
nod *next;
};
nod *l[50001];
int n,m,s,d[50001],t,tar[50001];
nod *ix;
queue<int> q;
bool inq[50001];
void add(int x,int y ,int z)
{ nod *p=new nod;
p->nd=y;
p->cost=z;
p->next=l[x];
l[x]=p;
nod *w=new nod;
w->nd=x;
w->cost=z;
w->next=l[y];
l[y]=w;
}
void initial(int e)
{ for(int i=1;i<=n;i++)
{ d[i]=INF;
inq[i]=0;
}
d[e]=0;
}
void relaxare(int u,int p,int w)
{ if(d[p]>d[u]+w)
{ d[p]=d[u]+w;
if(inq[p]==0)
{ q.push(p);
inq[p]=1;
}
}
}
void bford(int nod)
{ initial(nod);
q.push(nod);
inq[nod]=1;
while(!q.empty())
{ int a=q.front();
q.pop();
inq[a]=-1;
for(ix=l[a];ix;ix=ix->next)
{ relaxare(a,ix->nd,ix->cost);
}
}
}
int ver()
{ for(int k=1;k<=n;k++)
{ if(d[k]==INF)
d[k]=INF;
if(tar[k]!=d[k])
return 0;
}
return 1;
}
int main()
{ freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&t);
while(t)
{ scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=n;i++)
scanf("%d",&tar[i]);
int x,y,z;
for(int i=1;i<=m;i++)
{ scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
bford(s);
if(ver()==0)
printf("NU\n");
else printf("DA\n");
t--;
}
return 0;
}