Pagini recente » Cod sursa (job #2040841) | Cod sursa (job #2829547) | Cod sursa (job #1687129) | Cod sursa (job #1723371) | Cod sursa (job #2233798)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <limits.h>
const int NMAX=50001;
std::ifstream in("distante.in");
std::ofstream out("distante.out");
std::vector<int> distante;
std::vector<std::pair<int,int>> muchii[NMAX];
std::priority_queue<std::pair<int,int> , std::vector<std::pair<int,int>>,std::greater<std::pair<int,int>>> pq;
int costuri[NMAX];
bool viz[NMAX];
void dijkstra(int sursa){
pq.push({costuri[sursa]=0,sursa});
while(!pq.empty()){
auto pair=pq.top();
pq.pop();
if(viz[pair.second])
continue;
viz[pair.second]=1;
for(auto pr:muchii[pair.second])
if(!viz[pr.first] && costuri[pr.first] > costuri[pair.second] + pr.second)
costuri[pr.first] = costuri[pair.second] + pr.second , pq.push({costuri[pr.first],pr.first});
}
}
int main(){
int T,N,M,S,a,b,c;
bool ok=0;
in>>T;
for(int test=0;test<T;test++){
in>>N>>M>>S;
ok=1;
while(!pq.empty())
pq.pop();
distante.clear();
for(int i=1;i<=N;i++)
muchii[i].clear();
for(int i=1;i<=N;i++)
costuri[i]=INT_MAX/2-1,viz[i]=0;
distante.push_back(0);
for(int i=0;i<N;i++)
in>>a,distante.push_back(a);
for(int i=0;i<M;i++)
in>>a>>b>>c,muchii[a].push_back({b,c}),muchii[b].push_back({a,c});
dijkstra(S);
for(int i=1;i<=N;i++)
if(costuri[i]!=distante[i])
ok=0;
if(!ok)
out<<"NU\n";
else
out<<"DA\n";
}
return 0;
}