Pagini recente » Cod sursa (job #2983618) | Cod sursa (job #702510) | Cod sursa (job #171125) | Cod sursa (job #1648793) | Cod sursa (job #1096842)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
#define NMAX 50015
#define Gnode first
#define Gcost second
int Dist[NMAX];
vector < pair < int , int > > G[NMAX];
int N,M,S,T;
bool Valid;
void Read()
{
scanf("%d%d%d",&N,&M,&S);
for(int i=1;i<S;i++)
scanf("%d",&Dist[i]);
scanf("%d",&Dist[S]);
if(Dist[S])
{
Valid = false;
return;
}
for(int i=S+1;i<=N;i++)
scanf("%d",&Dist[i]);
for(int i=1,x,y,z;i<=M;i++)
{
scanf("%d%d%d",&x,&y,&z);
G[x].push_back(make_pair(y,z));
G[y].push_back(make_pair(x,z));
}
}
void CheckDijkstra()
{
for(int node=2;node<=N && Valid;node++)
{
bool foundEdge = false;
for(vector < pair < int , int > > :: iterator it = G[node].begin(); it != G[node].end(); ++ it )
if(Dist[(*it).Gnode] + (*it).Gcost < Dist[node])
{
Valid = false;
return;
}
else
if(Dist[(*it).Gnode] + (*it).Gcost == Dist[node])
foundEdge = true;
if(!foundEdge)
Valid = false;
}
}
void Print()
{
if(Valid)
printf("DA\n");
else
printf("NU\n");
}
void Reset()
{
for(int i=1;i<=N;i++)
G[i].clear();
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&T);
while(T--)
{
Valid = true;
Read();
if(Valid)
CheckDijkstra();
Print();
if(T)
Reset();
}
return 0;
}