Pagini recente » Cod sursa (job #48716) | Cod sursa (job #1900049) | Cod sursa (job #1977891) | Cod sursa (job #2940755) | Cod sursa (job #2461282)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#include <climits>
#define inf INT_MAX
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int d[50001], x, y, c, Nodes, Arcs, Origin, v[50001], T, test, i, viz[50001];
struct cmp{
bool operator () (int &a, int &b){
return d[a] > d[b];
}
};
vector < pair < int, int > > graph[50001];
priority_queue < int, vector <int>, cmp > heap;
int main()
{ f >> T;
for(test = 1; test <= T; test++){
memset(viz, 0, sizeof(viz));
f >> Nodes >> Arcs >> Origin;
for(i = 1; i <= Nodes; i++)
f >> v[i];
for(i = 1; i <= Arcs; i++){
f >> x >> y >> c;
graph[x].push_back({y,c});
graph[y].push_back({x,c});
}
for(i = 1; i <= Nodes; i++)
d[i] = inf;
d[Origin] = 0;
heap.push(Origin);
while(!heap.empty()){
if(viz[heap.top()] == 1){
heap.pop();
continue;
}
int node = heap.top();
for(i = 0; i < graph[node].size(); i++){
int new_node = graph[node][i].first;
int cost = graph[node][i].second;
if(d[new_node] > d[node] + cost){
d[new_node] = d[node] + cost;
heap.push(new_node);
viz[new_node] = 0;
}
}
viz[node] = 1;
}
for(i = 1; i <= Nodes; i++)
if(d[i] != v[i]){
g << "NU" << '\n';
break;
}
if(i > Nodes)
g << "DA" << '\n';
for(i = 1; i <= Nodes; i++)
graph[i].clear();
while(!heap.empty())
heap.pop();
}
return 0;
}