void DijkstraSP::construct() { assert(spTreeVertices.empty()); assert(parentTo.empty()); auto const numVertices = g.adj.size(); std::vector<int> openNodes(numVertices, -1); std::vector<int> nodeKeys(numVertices, LARGE_INT); std::vector<int> currentParentTo(numVertices, -1); std::iota(openNodes.begin(), openNodes.end(), 0); nodeKeys[0] = -LARGE_INT; auto comp = [&nodeKeys](const int v, const int w) {return nodeKeys[v] > nodeKeys[w]; }; while (!openNodes.empty()){ std::make_heap(openNodes.begin(), openNodes.end(), comp); // pop min auto minPQNode = openNodes.front(); std::pop_heap(openNodes.begin(), openNodes.end(), comp); openNodes.pop_back(); spTreeVertices.push_back(minPQNode); parentTo.push_back(currentParentTo[minPQNode]); updatePQFromNode(minPQNode, openNodes, nodeKeys, currentParentTo); } }
stk::mesh::EntityVector fill_shared_entities_that_need_fixing(const stk::mesh::BulkData& bulkData) { stk::mesh::EntityVector sides; stk::mesh::get_selected_entities(bulkData.mesh_meta_data().locally_owned_part(), bulkData.buckets(bulkData.mesh_meta_data().side_rank()), sides); stk::mesh::EntityVector sidesThatNeedFixing; for(stk::mesh::Entity side : sides) if(bulkData.state(side) == stk::mesh::Created) { unsigned num_nodes = bulkData.num_nodes(side); const stk::mesh::Entity* nodes = bulkData.begin_nodes(side); std::vector<stk::mesh::EntityKey> nodeKeys(num_nodes); for(unsigned int i=0;i<num_nodes;++i) nodeKeys[i] = bulkData.entity_key(nodes[i]); std::vector<int> shared_procs; bulkData.shared_procs_intersection(nodeKeys, shared_procs); if(!shared_procs.empty()) sidesThatNeedFixing.push_back(side); } return sidesThatNeedFixing; }