Pagini recente » Rating Vlad Grosu (vladtoma2008) | Cod sursa (job #1342165) | Cod sursa (job #1231773) | Cod sursa (job #1081499) | Cod sursa (job #2292697)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define INF 1005
int dist[50005];
struct Compare{
bool operator()(int a, int b){
return (dist[a] > dist[b]);
}
};
int main()
{
std::ifstream in("distante.in");
std::ofstream out("distante.out");
int T;
in >> T;
while(--T >= 0){
int N, M, sursa;
in >> N >> M >> sursa;
int Bronzarel[N + 1];
for(int i = 1; i <= N; ++i){
in >> Bronzarel[i];
}
bool viz[50005] = {};
for(int i = 0; i <= N; ++i){
dist[i] = INF;
}
dist[sursa] = 0;
std::vector< std::pair<int, int> > Graf[N + 1];
for(int i = 1; i <= M; ++i){
int x, y, cost;
in >> x >> y >> cost;
Graf[x].push_back(std::make_pair(y, cost));
Graf[y].push_back(std::make_pair(x, cost));
}
//std::cout << '*';
std::priority_queue<int, std::vector<int>, Compare> Coada;
Coada.push(sursa);
viz[sursa] = true;
while(!Coada.empty()){
int nod_curent = Coada.top();
Coada.pop();
for(int i = 0; i < Graf[nod_curent].size(); ++i){
int Capat = Graf[nod_curent][i].first;
int Cost = Graf[nod_curent][i].second;
if(dist[nod_curent] + Cost < dist[Capat]){
dist[Capat] = dist[nod_curent] + Cost;
if(!viz[Capat]){
Coada.push(Capat);
viz[Capat] = true;
}
}
}
}
bool OK = true;
for(int i = 1; i <= N; ++i){
if(dist[i] != Bronzarel[i]){
OK = false;
break;
}
}
if(OK == false){
out << "NU";
}
else{
out << "DA";
}
out << '\n';
}
return 0;
}