Pagini recente » Cod sursa (job #3152608) | Cod sursa (job #38371) | Cod sursa (job #2685240) | Cod sursa (job #3201975) | Cod sursa (job #2988482)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int t,n,m,dp[50005],viz[50005],v[50005],k;
vector <pair<int,int>> lista[50005];
void citire(){
for(int i=1;i<=n;i++)
lista[i].clear(),viz[i]=0,v[i]=0;
fin>>n>>m>>k;
for(int i=1;i<=n;i++)
fin>>v[i];
for(int i=1;i<=m;i++){
int x,y,cost;
fin>>x>>y>>cost;
lista[x].push_back({y,cost});
lista[y].push_back({x,cost});
}
}
void dijkstra(int start){
priority_queue<pair<int,int>> q;
for(int i=1;i<=n;i++)
dp[i]=INT_MAX;
q.push({0,start});
dp[start]=0;
while(!q.empty()){
int x=q.top().second;
q.pop();
if(viz[x])continue;
viz[x]=1;
for(auto vecin:lista[x]){
int cost=dp[x]+vecin.second;
if(dp[vecin.first]>cost){
dp[vecin.first]=cost;
if(!viz[vecin.first]){
q.push({-dp[vecin.first],vecin.first});
}
}
}
}
}
int main()
{
fin>>t;
for(int i=1;i<=t;i++){
citire();
dijkstra(k);
bool ok=true;
for(int i=1;i<=n;i++){
if(dp[i]!=v[i])
ok=false,i=n;
}
if(ok==false)
fout<<"NU"<<endl;
else
fout<<"DA"<<endl;
}
return 0;
}