#include <iostream>
#include <iomanip>
#include <boost/graph/grid_graph.hpp>
#include <boost/graph/detail/d_ary_heap.hpp>
#include <boost/property_map/property_map.hpp>
#include <cstdlib>
template <typename TGraph, typename TIndexInHeapMap>
static void OutputIndexHeapMap(TGraph g, TIndexInHeapMap indexHeapMap);
int main(int, char*[])
{
// Seed random number gererators
srand((unsigned int)time(NULL));
srand48((unsigned int)time(NULL));
// Create a graph
boost::array<std::size_t, 2> lengths = { { 2,2 } };
typedef boost::grid_graph<2> GraphType;
GraphType graph(lengths);
// Declare iterators that we will use
typedef boost::graph_traits<GraphType>::vertex_iterator VertexIteratorType;
VertexIteratorType vertexIterator, vertexIteratorEnd;
// Setup the graph properties
typedef boost::graph_traits<GraphType>::vertex_descriptor Vertex;
typedef boost::property_map<GraphType, boost::vertex_index_t>::const_type GridIndexMapType;
GridIndexMapType gridIndexMap(get(boost::vertex_index, graph));
typedef boost::vector_property_map<std::size_t, GridIndexMapType> IndexInHeapMap;
IndexInHeapMap index_in_heap(gridIndexMap);
// Initialize
for( tie(vertexIterator, vertexIteratorEnd) = vertices(graph); vertexIterator != vertexIteratorEnd; ++vertexIterator)
{
put(index_in_heap, *vertexIterator, (size_t)(-1));
}
std::cout << "Initial heap map" << std::endl;
OutputIndexHeapMap(graph, index_in_heap);
typedef boost::vector_property_map<float, GridIndexMapType> PriorityMapType;
PriorityMapType priorityMap(gridIndexMap);
// Setup the queue
typedef std::greater<float> ComparisonFunctor;
typedef boost::d_ary_heap_indirect<Vertex, 4, IndexInHeapMap,
PriorityMapType, ComparisonFunctor > MutableQueueType;
ComparisonFunctor comparisonFunctor;
MutableQueueType mutableQueue(priorityMap, index_in_heap, comparisonFunctor);
std::cout << "There are " << mutableQueue.size() << " items in the queue." << std::endl;
// Add random values to the vertices and add them to the queue
for( tie(vertexIterator, vertexIteratorEnd) = vertices(graph); vertexIterator != vertexIteratorEnd; ++vertexIterator)
{
float newPriority = rand() % 1000;
Vertex v = *vertexIterator;
std::cout << "Original priority for " << v[0] << ", " << v[1] << " " << newPriority << std::endl;
put(priorityMap, *vertexIterator, newPriority);
mutableQueue.push(*vertexIterator);
}
std::cout << "Heap map after initial pushes:" << std::endl;
OutputIndexHeapMap(graph, index_in_heap);
std::cout << "There are " << mutableQueue.size() << " items in the queue." << std::endl;
// Insert another set of random values for each vertex
for( tie(vertexIterator, vertexIteratorEnd) = vertices(graph); vertexIterator != vertexIteratorEnd; ++vertexIterator)
{
float newPriority = rand() % 1000;
Vertex v = *vertexIterator;
std::cout << "New priority for " << v[0] << ", " << v[1] << " " << newPriority << std::endl;
put(priorityMap, *vertexIterator, newPriority);
mutableQueue.update(*vertexIterator);
}
std::cout << "Heap map after updates:" << std::endl;
OutputIndexHeapMap(graph, index_in_heap);
std::cout << "There are " << mutableQueue.size() << " items in the queue." << std::endl;
// Output (and empty) the queue
while( ! mutableQueue.empty() )
{
// MutableQueueType::value_type u = mutableQueue.top();
Vertex u = mutableQueue.top();
// These two lines are equivalent
std::cout << "vertex: " << u[0] << " " << u[1]
<< " priority: " << get(mutableQueue.keys(), u)
<< std::endl;
mutableQueue.pop();
}
std::cout << "Heap map at end:" << std::endl; // All (size_t)(-1)
OutputIndexHeapMap(graph, index_in_heap);
std::cout << std::endl;
return 0;
}
template <typename TGraph, typename TIndexInHeapMap>
static void OutputIndexHeapMap(TGraph g, TIndexInHeapMap indexHeapMap)
{
typedef typename boost::graph_traits<TGraph>::vertex_iterator VertexIteratorType;
VertexIteratorType vertexIterator, vertexIteratorEnd;
for( tie(vertexIterator, vertexIteratorEnd) = vertices(g); vertexIterator != vertexIteratorEnd; ++vertexIterator)
{
std::cout << "Index: " << get(indexHeapMap, *vertexIterator) << std::endl;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KCiNpbmNsdWRlIDxib29zdC9ncmFwaC9ncmlkX2dyYXBoLmhwcD4KI2luY2x1ZGUgPGJvb3N0L2dyYXBoL2RldGFpbC9kX2FyeV9oZWFwLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3Byb3BlcnR5X21hcC9wcm9wZXJ0eV9tYXAuaHBwPgoKI2luY2x1ZGUgPGNzdGRsaWI+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVEdyYXBoLCB0eXBlbmFtZSBUSW5kZXhJbkhlYXBNYXA+CnN0YXRpYyB2b2lkIE91dHB1dEluZGV4SGVhcE1hcChUR3JhcGggZywgVEluZGV4SW5IZWFwTWFwIGluZGV4SGVhcE1hcCk7CgppbnQgbWFpbihpbnQsIGNoYXIqW10pCnsKICAvLyBTZWVkIHJhbmRvbSBudW1iZXIgZ2VyZXJhdG9ycwogIHNyYW5kKCh1bnNpZ25lZCBpbnQpdGltZShOVUxMKSk7CiAgc3JhbmQ0OCgodW5zaWduZWQgaW50KXRpbWUoTlVMTCkpOwoKICAvLyBDcmVhdGUgYSBncmFwaAogIGJvb3N0OjphcnJheTxzdGQ6OnNpemVfdCwgMj4gbGVuZ3RocyA9IHsgeyAyLDIgfSB9OwogIHR5cGVkZWYgYm9vc3Q6OmdyaWRfZ3JhcGg8Mj4gR3JhcGhUeXBlOwogIEdyYXBoVHlwZSBncmFwaChsZW5ndGhzKTsKCiAgLy8gRGVjbGFyZSBpdGVyYXRvcnMgdGhhdCB3ZSB3aWxsIHVzZQogIHR5cGVkZWYgYm9vc3Q6OmdyYXBoX3RyYWl0czxHcmFwaFR5cGU+Ojp2ZXJ0ZXhfaXRlcmF0b3IgVmVydGV4SXRlcmF0b3JUeXBlOwoKICBWZXJ0ZXhJdGVyYXRvclR5cGUgdmVydGV4SXRlcmF0b3IsIHZlcnRleEl0ZXJhdG9yRW5kOwoKICAvLyBTZXR1cCB0aGUgZ3JhcGggcHJvcGVydGllcwogIHR5cGVkZWYgYm9vc3Q6OmdyYXBoX3RyYWl0czxHcmFwaFR5cGU+Ojp2ZXJ0ZXhfZGVzY3JpcHRvciBWZXJ0ZXg7CiAgdHlwZWRlZiBib29zdDo6cHJvcGVydHlfbWFwPEdyYXBoVHlwZSwgYm9vc3Q6OnZlcnRleF9pbmRleF90Pjo6Y29uc3RfdHlwZSBHcmlkSW5kZXhNYXBUeXBlOwogIEdyaWRJbmRleE1hcFR5cGUgZ3JpZEluZGV4TWFwKGdldChib29zdDo6dmVydGV4X2luZGV4LCBncmFwaCkpOwoKICB0eXBlZGVmIGJvb3N0Ojp2ZWN0b3JfcHJvcGVydHlfbWFwPHN0ZDo6c2l6ZV90LCBHcmlkSW5kZXhNYXBUeXBlPiBJbmRleEluSGVhcE1hcDsKICBJbmRleEluSGVhcE1hcCBpbmRleF9pbl9oZWFwKGdyaWRJbmRleE1hcCk7CgogIC8vIEluaXRpYWxpemUKICBmb3IoIHRpZSh2ZXJ0ZXhJdGVyYXRvciwgdmVydGV4SXRlcmF0b3JFbmQpID0gdmVydGljZXMoZ3JhcGgpOyB2ZXJ0ZXhJdGVyYXRvciAhPSB2ZXJ0ZXhJdGVyYXRvckVuZDsgKyt2ZXJ0ZXhJdGVyYXRvcikKICB7CiAgICBwdXQoaW5kZXhfaW5faGVhcCwgKnZlcnRleEl0ZXJhdG9yLCAoc2l6ZV90KSgtMSkpOwogIH0KCiAgc3RkOjpjb3V0IDw8ICJJbml0aWFsIGhlYXAgbWFwIiA8PCBzdGQ6OmVuZGw7CiAgT3V0cHV0SW5kZXhIZWFwTWFwKGdyYXBoLCBpbmRleF9pbl9oZWFwKTsKCiAgdHlwZWRlZiBib29zdDo6dmVjdG9yX3Byb3BlcnR5X21hcDxmbG9hdCwgR3JpZEluZGV4TWFwVHlwZT4gUHJpb3JpdHlNYXBUeXBlOwogIFByaW9yaXR5TWFwVHlwZSBwcmlvcml0eU1hcChncmlkSW5kZXhNYXApOwoKICAvLyBTZXR1cCB0aGUgcXVldWUKICB0eXBlZGVmIHN0ZDo6Z3JlYXRlcjxmbG9hdD4gQ29tcGFyaXNvbkZ1bmN0b3I7CiAgdHlwZWRlZiBib29zdDo6ZF9hcnlfaGVhcF9pbmRpcmVjdDxWZXJ0ZXgsIDQsIEluZGV4SW5IZWFwTWFwLAogICAgICBQcmlvcml0eU1hcFR5cGUsIENvbXBhcmlzb25GdW5jdG9yID4gTXV0YWJsZVF1ZXVlVHlwZTsKCiAgQ29tcGFyaXNvbkZ1bmN0b3IgY29tcGFyaXNvbkZ1bmN0b3I7CiAgTXV0YWJsZVF1ZXVlVHlwZSBtdXRhYmxlUXVldWUocHJpb3JpdHlNYXAsIGluZGV4X2luX2hlYXAsIGNvbXBhcmlzb25GdW5jdG9yKTsKCiAgc3RkOjpjb3V0IDw8ICJUaGVyZSBhcmUgIiA8PCBtdXRhYmxlUXVldWUuc2l6ZSgpIDw8ICIgaXRlbXMgaW4gdGhlIHF1ZXVlLiIgPDwgc3RkOjplbmRsOwoKICAvLyBBZGQgcmFuZG9tIHZhbHVlcyB0byB0aGUgdmVydGljZXMgYW5kIGFkZCB0aGVtIHRvIHRoZSBxdWV1ZQogIGZvciggdGllKHZlcnRleEl0ZXJhdG9yLCB2ZXJ0ZXhJdGVyYXRvckVuZCkgPSB2ZXJ0aWNlcyhncmFwaCk7IHZlcnRleEl0ZXJhdG9yICE9IHZlcnRleEl0ZXJhdG9yRW5kOyArK3ZlcnRleEl0ZXJhdG9yKQogIHsKICAgIGZsb2F0IG5ld1ByaW9yaXR5ID0gcmFuZCgpICUgMTAwMDsKICAgIFZlcnRleCB2ID0gKnZlcnRleEl0ZXJhdG9yOwoKICAgIHN0ZDo6Y291dCA8PCAiT3JpZ2luYWwgcHJpb3JpdHkgZm9yICIgPDwgdlswXSA8PCAiLCAiIDw8IHZbMV0gPDwgIiAiIDw8IG5ld1ByaW9yaXR5IDw8IHN0ZDo6ZW5kbDsKICAgIHB1dChwcmlvcml0eU1hcCwgKnZlcnRleEl0ZXJhdG9yLCBuZXdQcmlvcml0eSk7CiAgICBtdXRhYmxlUXVldWUucHVzaCgqdmVydGV4SXRlcmF0b3IpOwogIH0KCiAgc3RkOjpjb3V0IDw8ICJIZWFwIG1hcCBhZnRlciBpbml0aWFsIHB1c2hlczoiIDw8IHN0ZDo6ZW5kbDsKICBPdXRwdXRJbmRleEhlYXBNYXAoZ3JhcGgsIGluZGV4X2luX2hlYXApOwoKICBzdGQ6OmNvdXQgPDwgIlRoZXJlIGFyZSAiIDw8IG11dGFibGVRdWV1ZS5zaXplKCkgPDwgIiBpdGVtcyBpbiB0aGUgcXVldWUuIiA8PCBzdGQ6OmVuZGw7CgogIC8vIEluc2VydCBhbm90aGVyIHNldCBvZiByYW5kb20gdmFsdWVzIGZvciBlYWNoIHZlcnRleAogIGZvciggdGllKHZlcnRleEl0ZXJhdG9yLCB2ZXJ0ZXhJdGVyYXRvckVuZCkgPSB2ZXJ0aWNlcyhncmFwaCk7IHZlcnRleEl0ZXJhdG9yICE9IHZlcnRleEl0ZXJhdG9yRW5kOyArK3ZlcnRleEl0ZXJhdG9yKQogIHsKICAgIGZsb2F0IG5ld1ByaW9yaXR5ID0gcmFuZCgpICUgMTAwMDsKCiAgICBWZXJ0ZXggdiA9ICp2ZXJ0ZXhJdGVyYXRvcjsKICAgIHN0ZDo6Y291dCA8PCAiTmV3IHByaW9yaXR5IGZvciAiIDw8IHZbMF0gPDwgIiwgIiA8PCB2WzFdIDw8ICIgIiA8PCBuZXdQcmlvcml0eSA8PCBzdGQ6OmVuZGw7CiAgICBwdXQocHJpb3JpdHlNYXAsICp2ZXJ0ZXhJdGVyYXRvciwgbmV3UHJpb3JpdHkpOwogICAgbXV0YWJsZVF1ZXVlLnVwZGF0ZSgqdmVydGV4SXRlcmF0b3IpOwogIH0KCiAgc3RkOjpjb3V0IDw8ICJIZWFwIG1hcCBhZnRlciB1cGRhdGVzOiIgPDwgc3RkOjplbmRsOwogIE91dHB1dEluZGV4SGVhcE1hcChncmFwaCwgaW5kZXhfaW5faGVhcCk7CgogIHN0ZDo6Y291dCA8PCAiVGhlcmUgYXJlICIgPDwgbXV0YWJsZVF1ZXVlLnNpemUoKSA8PCAiIGl0ZW1zIGluIHRoZSBxdWV1ZS4iIDw8IHN0ZDo6ZW5kbDsKCiAgLy8gT3V0cHV0IChhbmQgZW1wdHkpIHRoZSBxdWV1ZQogIHdoaWxlKCAhIG11dGFibGVRdWV1ZS5lbXB0eSgpICkKICB7Ci8vICAgIE11dGFibGVRdWV1ZVR5cGU6OnZhbHVlX3R5cGUgdSA9IG11dGFibGVRdWV1ZS50b3AoKTsKICAgIFZlcnRleCB1ID0gbXV0YWJsZVF1ZXVlLnRvcCgpOwoKICAgIC8vIFRoZXNlIHR3byBsaW5lcyBhcmUgZXF1aXZhbGVudAogICAgc3RkOjpjb3V0IDw8ICJ2ZXJ0ZXg6ICIgPDwgdVswXSA8PCAiICIgPDwgdVsxXQogICAgICAgICAgICAgIDw8ICIgcHJpb3JpdHk6ICIgPDwgZ2V0KG11dGFibGVRdWV1ZS5rZXlzKCksIHUpCiAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwoKICAgIG11dGFibGVRdWV1ZS5wb3AoKTsKICB9CgogIHN0ZDo6Y291dCA8PCAiSGVhcCBtYXAgYXQgZW5kOiIgPDwgc3RkOjplbmRsOyAvLyBBbGwgKHNpemVfdCkoLTEpCiAgT3V0cHV0SW5kZXhIZWFwTWFwKGdyYXBoLCBpbmRleF9pbl9oZWFwKTsKCiAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCiAgcmV0dXJuIDA7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUR3JhcGgsIHR5cGVuYW1lIFRJbmRleEluSGVhcE1hcD4Kc3RhdGljIHZvaWQgT3V0cHV0SW5kZXhIZWFwTWFwKFRHcmFwaCBnLCBUSW5kZXhJbkhlYXBNYXAgaW5kZXhIZWFwTWFwKQp7CiAgdHlwZWRlZiB0eXBlbmFtZSBib29zdDo6Z3JhcGhfdHJhaXRzPFRHcmFwaD46OnZlcnRleF9pdGVyYXRvciBWZXJ0ZXhJdGVyYXRvclR5cGU7CiAgVmVydGV4SXRlcmF0b3JUeXBlIHZlcnRleEl0ZXJhdG9yLCB2ZXJ0ZXhJdGVyYXRvckVuZDsKICBmb3IoIHRpZSh2ZXJ0ZXhJdGVyYXRvciwgdmVydGV4SXRlcmF0b3JFbmQpID0gdmVydGljZXMoZyk7IHZlcnRleEl0ZXJhdG9yICE9IHZlcnRleEl0ZXJhdG9yRW5kOyArK3ZlcnRleEl0ZXJhdG9yKQogIHsKICAgIHN0ZDo6Y291dCA8PCAiSW5kZXg6ICIgPDwgZ2V0KGluZGV4SGVhcE1hcCwgKnZlcnRleEl0ZXJhdG9yKSA8PCBzdGQ6OmVuZGw7CiAgfQp9Cg==