Pagini recente » Cod sursa (job #2809238) | Cod sursa (job #768938) | Istoria paginii runda/rar29 | Cod sursa (job #2747922) | Cod sursa (job #2822137)
#include <bits/stdc++.h>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
const int INF=0x3f3f3f3f;
const int MAXN=50001;
int T,N,M,S,x,y,c,i,j,k;
int visited[MAXN],d[MAXN],dist[MAXN];
vector<pair<int, int>> G[MAXN];
int main()
{
in>>T;
for(k=1; k<=T; ++k)
{
in>>N>>M>>S;
for(i=1; i<=N; i++)
in>>d[i];
for(i=1; i<=N; i++)
while(G[i].size())
G[i].pop_back();
for(i=1; i<=M; i++)
{
int x,y,c;
in>>x>>y>>c;
G[x].push_back(make_pair(y,c));
}
memset(dist,INF,sizeof(dist));
memset(visited,0,sizeof(visited));
queue<int> Q;
Q.push(S);
dist[S]=0;
visited[S]=1;
while(!Q.empty())
{
x=Q.front();
Q.pop();
visited[x]=0;
for(auto elem : G[x])
{
int node = elem.first;
int cost = elem.second;
if(dist[x] + cost < dist[node])
{
dist[node]=dist[x]+cost;
if(visited[node]==0)
Q.push(node);
visited[node]=1;
}
}
}
x=1;
for(i=1; i<=N&&x; ++i)
if(d[i]!=dist[i])
x=0;
if(x)
out<<"DA\n";
else
out<<"NU\n";
}
return 0;
}