C++提升图 - 为什么我有一个额外的顶点

C++ Boost Graph - Why do I have an additional vertex?

本文关键字:有一个 顶点 为什么 C++      更新时间:2023-10-16

>我有一个图表,其顶点和边缘是自定义类型的。在下面的示例中,我创建了具有 4 个顶点和 4 条边的图形。但是,当我遍历顶点以打印它时,系统总共输出了 5 个顶点。我不确定我做错了什么,我希望有人能够在这方面启发我。

struct Vertex { int id; double data; };
struct Edge { float distance; };
int main(int, char** argv)
{
typedef boost::adjacency_list<boost::listS, boost::vecS, boost::directedS, Vertex, Edge> Graph;
//instantiate a graph
Graph g;
//add vertices
boost::add_vertex(Vertex{ 1, 1.1 }, g);
boost::add_vertex(Vertex{ 2, 2.2 }, g);
boost::add_vertex(Vertex{ 3, 3.3 }, g);
boost::add_vertex(Vertex{ 4, 4.4 }, g);
boost::add_edge(1, 2, g);
boost::add_edge(1, 4, g);
boost::add_edge(2, 4, g);   
boost::add_edge(1, 3, g);
// Iterate through the vertices and print them out
typedef boost::graph_traits<Graph>::vertex_iterator vertex_iter;
std::pair<vertex_iter, vertex_iter> vp;
for (vp = boost::vertices(g); vp.first != vp.second; vp.first++)
    std::cout << g[*(vp.first)].id << " " << g[*(vp.first)].data << std::endl;
// Iterate through the edges and print them out
auto es = boost::edges(g);
for (auto eit = es.first; eit != es.second; ++eit) {
    std::cout << boost::source(*eit, g) << ' ' << boost::target(*eit, g) << std::endl;
}

输出如下

1 1.1
2 2.2
3 3.3
4 4.4
0 0
1 2
1 4
1 3
2 4

从文档中:

如果图形的 VertexList 是 vecS,则图形具有通过 vertex_index_t 属性的属性映射访问的内置顶点索引。指数在 [0, num_vertices(g)) 范围内,并且是连续的。

add_vertex的描述没有明确说明,但我相信上述内容需要将带有描述符 u 的顶点添加到图形中必须创建顶点 0 到 u(如果它们中的任何一个不存在)。从根本上说,它只是将顶点向量的大小调整为 u + 1,以便 u 成为有效的索引。

相关文章: