Example #1
0
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;
}