Pagini recente » Atasamentele paginii Clasament oji2009123 | Cod sursa (job #1396021) | Cod sursa (job #252178) | Cod sursa (job #2079333) | Cod sursa (job #2822147)
#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;
int visited[MAXN],d[MAXN],dist[MAXN];
vector<pair<int, int>> G[MAXN];
queue<int> Q;
int main()
{
in>>T;
while(T--)
{
in>>N>>M>>S;
for(int i=1; i<=N; i++)
in>>d[i];
for(int i=1; i<=N; i++)
while(G[i].size())
G[i].pop_back();
for(int i=1; i<=M; i++)
{
in>>x>>y>>c;
G[x].push_back(make_pair(y,c));
G[y].push_back(make_pair(x,c));
}
memset(dist,INF,sizeof(dist));
memset(visited,0,sizeof(visited));
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;
}
}
}
}
int ok = 1;
for(int i=1; i<=N&&ok; ++i)
if(d[i]!=dist[i])
ok=0;
if(ok)
out<<"DA\n";
else
out<<"NU\n";
}
return 0;
}