Pagini recente » Cod sursa (job #661652) | Cod sursa (job #2368668) | Cod sursa (job #1543779) | Cod sursa (job #2325470) | Cod sursa (job #2829398)
#include<bits/stdc++.h>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
struct CustomCompare2{
bool operator()(const pair<int,int> &a, const pair<int,int> &b){
return a.second>b.second;
}
};
vector<pair<int,int>> m_adjListCost[50001];
int n,m,s;
void Dijkstra(int x,vector<int> &isMarked, priority_queue<pair<int,int>,vector<pair<int,int>>,CustomCompare2> &heap, vector<int> &length) {
int i;
isMarked[x]++;
for(i=0;i<m_adjListCost[x].size();++i){
if(isMarked[m_adjListCost[x][i].first]==0){
pair<int,int> aux;
heap.push(make_pair(m_adjListCost[x][i].first,m_adjListCost[x][i].second+length[x]));
}
}
pair<int,int> frt;
while(heap.size()>0){
frt=heap.top();
heap.pop();
if(isMarked[frt.first]==0){
length[frt.first]=frt.second;
Dijkstra(frt.first,isMarked,heap,length);
}
}
}
vector<int> DijkstraResult(int start) {
vector<int> isMarked,length;
priority_queue<pair<int,int>,vector<pair<int,int>>,CustomCompare2>heap;
int i;
isMarked.clear();
length.clear();
while(!heap.empty())
heap.pop();
for(i=0;i<n;++i){
isMarked.push_back(0);
length.push_back(0);
}
length[s]=0;
Dijkstra(start,isMarked,heap,length);
return length;
}
int main(){
int t,a,b,c;
vector<string> ans;
vector<int> zaharel,res;
f>>t;
int i,j,k;
for(i=0;i<t;++i){
f>>n>>m>>s;
zaharel.clear();
for(j=0;j<n;++j)
{
f>>a;
zaharel.push_back(a);
}
for(j=0;j<m;++j){
f>>a>>b>>c;
m_adjListCost[a-1].push_back(make_pair(b-1,c));
m_adjListCost[b-1].push_back(make_pair(a-1,c));
}
res=DijkstraResult(s-1);
if(zaharel==res){
ans.push_back("DA");
}
else{
ans.push_back("NU");
}
for(j=0;j<n;++j){
m_adjListCost[i].clear();
}
}
for(i=0;i<ans.size();++i){
g<<ans[i]<<'\n';
}
return 0;
}