【问题标题】:Graph Representation in C++C++ 中的图形表示
【发布时间】:2011-09-29 19:53:32
【问题描述】:
我正在阅读一本书The Design and Analysis of Computer Algorithms 阅读图表章节,我正在尝试实现DFS。通过阅读该算法的定义,它说,图形G=(V,E) 将E 中的边分成两组T 和B。如果顶点 v 考虑到边 (v,w) 之前尚未访问过顶点 w ,则边 (v,w) 放置在集合 T 中,否则边 `(v,w) 放置在集合 B 中。
基本上,他的DFS 算法会给我新的图形,即G=(V,T)。我想知道如何在 C++ 中实现这一点。
我尝试使用adjacency list,但我很困惑是否需要存储edges 的map 的list 应该没问题。
【问题讨论】:
标签:
c++
algorithm
data-structures
【解决方案1】:
在VTK 中,边存储在vector 中,并且总是存储一对(v,w)。在这个向量附近还有另外 2 个向量向量来存储图节点的进出边。当添加一条新边时,它被添加到边向量中,它的节点 (v,w) 也被添加到向量的 in 和 out 边向量中。
【解决方案2】:
我不太清楚你的确切问题是什么。我假设您在询问如何维护两个集合 T 和 B 以区分已访问的边与 DFS 期间未访问的边。我认为最简单的方法是在邻接列表中的节点结构中添加一个布尔字段“已访问”。所有节点的该字段的初始值为“false”。假设在上述情况下,当 DFS 到 v 时,边 (v,w) 没有被访问,那么 v 的列表中与 w 对应的节点此时的“已访问”值为“false” .否则它的值为“true”。
我认为作者只是试图给你一个想法,边将被分为两种:在 DFS 结束时已访问和未访问。但我认为保持这两种边缘的两个显式集合是不必要的。您始终可以在 DFS 之后根据更新的“已访问”值打印已访问的边。