遍历MultiMap以查找从给定值到给定键的路径

时间:2013-03-08 23:16:34

标签: c++ multimap adjacency-list

详细信息:

我有一个multimap实现,它表示图形子集的邻接列表。

我需要找到一个通过图形子集的路径,这个路径实际上是从起始节点F到结束节点G的所有可能路径,通过运行广度优先搜索获得完整的图表。

实施理念:

BFS在找到G后退出,因此您只能在多地图的值中使用G。我的想法是,如果您从价值G开始,请获取G的“密钥”(让我们称之为H),如果H == F,那么我们就有了路径。否则,您继续查找H作为与其他键相关联的值(称之为D),如果D == F则我们有路径...此时我们的路径从F看起来像F -> H -> G

的问题:

这会扩大规模吗?由于地图仅包含从FG的可能路径的子集,在G处停止,因此不应意外地制作圆形路径或制作重复的密钥。如果子集是基数n,则n将是任何给定键的最大值,因此连接的边数永远不会超过n。

您将如何编码?

我可以通过所涉及的逻辑和数学进行思考,但我还不了解地图库,但我自己也写不出来。 在阅读c ++参考资料后,我得到了一个想法,我可以使用地图方法upper/lowerbound,但我找不到支持它的例子。

2 个答案:

答案 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的元素