Pagini recente » Cod sursa (job #494709) | Cod sursa (job #7109) | Cod sursa (job #2035571) | Cod sursa (job #2960595) | Cod sursa (job #200443)
Cod sursa(job #200443)
#include<stdio.h>
#include<vector>
#define nmax 50024
using namespace std;
vector < pair<int,int> >q[nmax];
vector < pair <int,int> >::iterator it;
int dmin[nmax];
bool v[nmax];
int viz[nmax],t,S;
int space[nmax];
bool aha[nmax];
int check_up(const int N)
{
int inc=1,sf=1;
int a1,a2,a,b;
int nod;
space[ viz[1] ]=0;
while(inc<=sf)
{
nod=viz[inc];
v[ nod ]=true;
a=space[nod];
for(it=q[nod].begin(); it!=q[nod].end(); ++it)
{
a1=it->first;
a2=it->second;
b=space[a1];
if( a1!=S )
if( !b || a<b){
if( dmin[a1]> dmin[nod]+a2 || !dmin[a1] )
return 0;
}
else
if( a>b )
if( dmin[nod]+a2 < dmin[a1] ){
return 0;
}
if( dmin[nod]+a2==dmin[a1] )
aha[a1]=true;
if( v[a1]==false ){
space[ a1 ]=a+1;
viz[++sf]=a1,v[a1]=true;
}
}
++inc;
}
int i,w=0;
for(i=1; i<=N; ++i)
if(aha[i]==false){
return 0;
}
if( sf==N )
return 1;
return 0;
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int T,N,M;
int i;
int a1,a2,a3;
scanf("%d",&T);
while( T-- )
{
scanf("%d%d%d",&N,&M,&S);
for(i=1; i<=N; ++i) scanf("%d",&dmin[i]),v[i]=false,q[i].clear(),aha[i]=false;
v[S]=true;viz[1]=S;
aha[S]=true;
for(i=1; i<=M; ++i){
scanf("%d%d%d",&a1,&a2,&a3);
q[a1].push_back(make_pair(a2,a3));
q[a2].push_back(make_pair(a1,a3));
}
if( dmin[S] || !check_up(N))
printf("NU\n");
else
printf("DA\n");
}
return 0;
}