Pagini recente » Cod sursa (job #1175860) | Cod sursa (job #2685608) | Cod sursa (job #1019413) | Cod sursa (job #25135) | Cod sursa (job #2908154)
#include <bits/stdc++.h>
using namespace std;
#define MAX_COST 1000000
class minHeapComp{
public:
bool operator()(pair<int, int> n1, pair<int, int> n2){
return n1.second > n2.second;
}
};
struct Edge{
int dest;
int cost;
Edge( int dest, int cost){
this->dest = dest;
this->cost = cost;
}
};
vector<int> Djikstra(int node_nbr, int src_node, vector<vector<Edge>> adj){
priority_queue<pair<int,int>, vector<pair<int,int>>,minHeapComp > heap;
vector<int> my_dist(node_nbr + 1, MAX_COST);
heap.push({src_node,0});
my_dist[src_node] = 0;
while(!heap.empty()){
pair<int, int> curr_node = heap.top();
heap.pop();
for(auto next_node : adj[curr_node.first]){
if(my_dist[curr_node.first] + next_node.cost < my_dist[next_node.dest] ){
my_dist[next_node.dest] = my_dist[curr_node.first] + next_node.cost;
heap.push({next_node.dest, my_dist[next_node.dest]});
}
}
}
return my_dist;
}
int main()
{
ifstream fin("distante.in");
ofstream fout("distante.out");
int graphs_nbr, node_nbr, edge_nbr, src_node, dist, src, dest, cost;
fin>>graphs_nbr; //T
for (int i = 0; i < graphs_nbr; i++){
fin>>node_nbr>>edge_nbr>>src_node; //N,M,S
vector<int> distances(node_nbr + 1,MAX_COST);
vector<vector<Edge>> adj(node_nbr + 1);
for(int j = 1; j <= node_nbr; j++){
fin>>dist;
distances[j] = dist;
}
for(int j = 0; j < edge_nbr; j++){
fin>>src>>dest>>cost;
Edge e(dest, cost);
adj[src].push_back(e);
Edge e1(src, cost);
adj[dest].push_back(e1);
}
vector<int> my_dist = Djikstra(node_nbr, src_node, adj);
bool ok = 1;
for(int j = 1; j <= node_nbr; j++){
if(my_dist[j] != distances[j]){
ok = 0;
break;
}
}
if(ok)
fout<<"DA\n";
else
fout<<"NU\n";
}
fin.close();
fout.close();
return 0;
}
// cout<<"info graf:\n"<<node_nbr<<" "<<edge_nbr<<" "<<src_node<<'\n';
// cout<<"muchii:\n";
// for(auto it: adj){
// for(auto e: it){
// cout<<e.src<<' '<<e.dest<<' '<<e.cost<<'\n';
// }
// }
//
// cout<<"distante date:\n";
// for(auto it: distances){
// cout<<it<<' ';
// }
// cout<<'\n';
//
// cout<<"distante calculate:\n";
// for(auto it: my_dist){
// cout<<it<<' ';
// }
// cout<<'\n';
// cout<<'\n';
// if(equal(distances.begin(),distances.end(),my_dist.begin())){
// fout<<"DA\n";
//
// }else{
//
// fout<<"NU\n";
// }