Pagini recente » Cod sursa (job #835857) | Cod sursa (job #2625272) | Cod sursa (job #3002133) | Cod sursa (job #1080094) | Cod sursa (job #875167)
Cod sursa(job #875167)
#include<stdio.h>
#include<stack>
#define Nmax 50002
using namespace std;
int s,n,m,t;
struct graf
{
int v,c;
graf *adr;
};
graf *g[Nmax];
int d[Nmax];
stack<int> st;
void graf_add(int v1,int v2,int c)
{
graf *p;
p=new graf;
p->v=v2;
p->c=c;
p->adr=g[v1];
g[v1]=p;
}
void citire()
{
int i,x,y,c;
scanf("%d %d %d",&n,&m,&s);
while(!st.empty())
st.pop();
for(i=1;i<=n;++i)
{
g[i]=0;
scanf("%d",&d[i]);
}
for(i=1;i<=m;++i)
{
scanf("%d %d %d",&x,&y,&c);
graf_add(x,y,c);
graf_add(y,x,c);
}
}
int check(int x)
{
int k;
graf *p;
if(d[x]!=0)
return 0;
k=1;
for(p=g[x];p;p=p->adr)
if(d[p->v]==p->c)
{
++k;
st.push(p->v);
}
while(!st.empty() && k<n)
{
x=st.top();
st.pop();
for(p=g[x];p;p=p->adr)
if(d[p->v]==d[x]+p->c)
{
st.push(p->v);
++k;
}
}
if(k==n)
return 1;
return 0;
}
void rezolv()
{
int i,ok;
scanf("%d",&t);
for(i=1;i<=t;++i)
{
citire();
ok=check(s);
if(ok==0)
printf("NU\n");
else
printf("DA\n");
}
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
rezolv();
fclose(stdin);
fclose(stdin);
return 0;
}