Pagini recente » Cod sursa (job #2088919) | Cod sursa (job #1677898) | Cod sursa (job #2048226) | Cod sursa (job #2685531) | Cod sursa (job #1724090)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int Inf=(1<<30);
const int N=50005;
int dist[N],drum[N];
typedef pair <int,int> ii;
priority_queue < ii, vector<ii>, greater<ii> > pq;
vector <ii> G[N];
void dijkstra()
{
int n,m,s,a,b,c,u,v,d,i;
scanf("%d%d%d",&n,&m,&s);
for(i=1;i<=n;i++)
{
scanf("%d",&drum[i]);
dist[i]=Inf;
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
G[a].push_back(ii(b,c));
G[b].push_back(ii(a,c));
}
dist[s]=0;
pq.push(ii(0,s));
while(!pq.empty())
{
d=pq.top().first;
u=pq.top().second;
pq.pop();
if(d>dist[u]) continue;
for(i=0;i<(int)G[u].size();i++)
{
v=G[u][i].first;
d=G[u][i].second;
if(dist[v]>dist[u]+d)
{
dist[v]=dist[u]+d;
pq.push(ii(dist[v],v));
}
}
}
for(i=1;i<=n;i++)
if(dist[i]!=drum[i])
{
printf("NU\n");
break;
}
if(i>n) printf("DA\n");
for(i=1;i<=n;i++)
G[i].clear();
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int t;
scanf("%d",&t);
while(t--)
dijkstra();
return 0;
}