【问题标题】:Boost Graph Getting Adjacent VerticesBoost Graph获取相邻顶点
【发布时间】:2015-07-21 13:15:31
【问题描述】:

我正在使用 Boost 库处理图形。 该图定义如下。

 typedef boost::adjacency_list<boost::setS,boost::setS,boost::undirectedS, uint32_t, float> AdjacencyList;

在使用适当的数据创建图形后,我想在一个单独的函数中打印每个顶点的相邻顶点以及它们在开始时计算的适当边权重。

创建部分效果很好,但是当我想提取相邻顶点时,我没有得到值。

typedef boost::graph_traits<AdjacencyList>::adjacency_iterator AdjacencyIterator;
AdjacencyList::vertex_iterator i, end;
for (boost::tie(i, end) = boost::vertices(adjacency_list); i != end; i++) {
AdjacencyIterator ai, a_end; 
boost::tie(ai, a_end) = boost::adjacent_vertices( *i, adjacency_list);
  for (; ai != a_end; ai++) { 
      std::cout << *ai << "\t";
  }
 }

我得到的输出是十六进制数字的内存地址。 如何获取顶点索引和边权重?

【问题讨论】:

  • 您实际上在那里使用了两个单独的图...您无法在在另一个图中中查找相邻顶点的顶点;你的实际代码是什么? (忽略了明显的语法错误和缺少声明)
  • adjacency_list 是 AdjacencyList 类型。这是同一张图,但我只是跳过了所有其他代码。
  • 太棒了。 supervoxel_adjacency_list 是什么?你知道,不值得在不恰当的问题上浪费时间。
  • 抱歉,这是我程序中给出的名称,但我在写问题时从名称中删除了 supervoxel_ 到 adjacency_list

标签: c++ algorithm boost graph


【解决方案1】:

您应该使用带有顶点/边描述符的图形的operator[] 或使用属性映射来访问属性包:

使用operator[]

Live On Coliru

#include <boost/graph/adjacency_list.hpp>
#include <iostream>

typedef boost::adjacency_list<boost::setS,boost::setS,boost::undirectedS, uint32_t, float> AdjacencyList;
typedef boost::graph_traits<AdjacencyList>::adjacency_iterator AdjacencyIterator;

int main() {
    AdjacencyList adjacency_list;;

    boost::add_edge(
            boost::add_vertex(10, adjacency_list),
            boost::add_vertex(20, adjacency_list),
            1.5f,
            adjacency_list
        );

    boost::add_edge(
            boost::add_vertex(30, adjacency_list),
            boost::add_vertex(40, adjacency_list),
            2.5f,
            adjacency_list
        );

    AdjacencyList::vertex_iterator i, end;

    for (boost::tie(i, end) = boost::vertices(adjacency_list); i != end; i++) {
        AdjacencyIterator ai, a_end; 

        boost::tie(ai, a_end) = boost::adjacent_vertices(*i, adjacency_list);
        for (; ai != a_end; ai++) { 
            std::cout << adjacency_list[*ai] << "\t";
        }
    }
}

输出:

10  20  30  40  

使用属性映射:

boost::property_map<AdjacencyList, boost::vertex_bundle_t>::type pmap = boost::get(boost::vertex_bundle, adjacency_list);

现在您可以使用boost::get(pmap, vertex_descriptor1) 访问顶点属性包

【讨论】:

  • 感谢它运行良好。对于在问题中造成混乱,我深表歉意。关于您发布的解决方案的最后一个问题。我们应该使用property_map或operator []的规则或优势吗?或者两者都可以?
  • 捆绑的想法是你不需要使用property_map&lt;&gt;。但有时算法需要一个属性映射作为参数。在这种情况下,没有其他选择
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
相关资源
最近更新 更多