详细信息:
我有一个multimap实现,它表示图形子集的邻接列表。
我需要找到一个通过图形子集的路径,这个路径实际上是从起始节点F
到结束节点G
的所有可能路径,通过运行广度优先搜索获得完整的图表。
实施理念:
BFS在找到G
后退出,因此您只能在多地图的值中使用G
。我的想法是,如果您从价值G
开始,请获取G
的“密钥”(让我们称之为H
),如果H == F
,那么我们就有了路径。否则,您继续查找H
作为与其他键相关联的值(称之为D
),如果D == F
则我们有路径...此时我们的路径从F
看起来像F -> H -> G
的问题:
这会扩大规模吗?由于地图仅包含从F
到G
的可能路径的子集,在G处停止,因此不应意外地制作圆形路径或制作重复的密钥。如果子集是基数n,则n将是任何给定键的最大值,因此连接的边数永远不会超过n。
您将如何编码?
我可以通过所涉及的逻辑和数学进行思考,但我还不了解地图库,但我自己也写不出来。 在阅读c ++参考资料后,我得到了一个想法,我可以使用地图方法 upper/lowerbound
,但我找不到支持它的例子。
答案 0 :(得分:2)
原来是相对微不足道的:
typedef multimap<int, int> MapType;
typedef MapType::const_iterator MapItr;
vector<int> path;
path.push_back(G);
int end = G; // we know G, so mark it
while ( end != F ) { // as long as mark is not F
// now loop through map searching for value that matches G
for (MapItr iter = pathMap.begin(); iter != pathMap.end(); iter++)
{
if (iter->second == end) { // once we find our marked value/vertex
path.push_back(iter->first); // push it's key onto the vector
end = iter->first; // and mark it's key for next iteration
// continue this until end reaches F
} // at which point will have our path
// from G to F
}
}
// avoid this step by using a container with a push_front method
reverse(path.begin(), path.end()); // reverse path
答案 1 :(得分:0)
您可以循环浏览整个地图
C ++ 11
for(const auto& key_val: the_map)
{
std::cout<<key_val.first<<":"<<key_val.second<<std::endl;
}
非C ++ 11
for(the_map_type::const_iterator itr = the_map.begin(); itr != the_map.end();++itr)
{
std::cout<<itr->first<<":"<<itr->second<<std::endl;
}
the_map.lower_bound(key)
将为您提供第一个具有键key
the_map.upper_bound(key)
将为您提供一个元素的迭代器,该元素超过任何带有键key
的元素