【问题标题】:C++: is a Graph ADT supposed to have a list of vertices and a list of edges or just vertices with pointers to other vertices?C++:Graph ADT 应该有一个顶点列表和一个边列表,还是只是带有指向其他顶点的指针的顶点?
【发布时间】:2013-10-04 15:43:37
【问题描述】:

我正在尝试在 C++ 中实现一个图形,我不确定是否有一种“正确”的方式来解决这个问题。我的每个顶点是否应该包含它指向的顶点列表,或者图形对象是否应该包含顶点列表和边列表。

【问题讨论】:

  • 没有单一的最佳表示。你的用例是什么?
  • 这可能很模糊,但我只是想在每个顶点存储一些简单的整数,以便我可以尝试实现 Dijkstra 的算法。
  • 然后查看 Dijkstra 算法的伪代码并决定哪种表示更适合该应用程序。
  • Dijsktra 不是在评估边而不是顶点上工作吗?或者你正在尝试它的一些变化?

标签: c++ graph adt vertices edges


【解决方案1】:

这取决于您要处理的图表类型, 如果您的图表是加权的,您就不能只拥有一个指针列表,因为您将无法为此连接分配权重。 在这种情况下,我建议每个节点都包含一个连接到它的边列表。如果图不是有向的,那么对于任何顶点 i 和 j,您可以保存指向同一边 {i, j} 的指针,如果它是有向的,则边 {i, j} 和 {j, i} 是两个不同的对象.

另一种方法是保存一个表示所有顶点之间连接的 NxN 矩阵。如果图没有加权,则如果顶点 i 到顶点 j 之间存在边,则每个单元格 [i, j] 将为 1。如果图是加权的,那么单元格 [i, j] 将包含顶点 i 到顶点 j 之间的距离,如果边不存在,则为无穷大或 -1。

如果您的图形是完整的(每个顶点都连接到所有其他顶点),我强烈建议使用矩阵技术,因为它很容易实现,让您可以直接访问任何相关值,并且不占用额外的内存或运行时间(例如,当您想要遍历连接到某个顶点的所有边时),因为任何顶点都将包含与所有其他顶点的连接列表。

【讨论】:

    【解决方案2】:

    这取决于您对图形数据的访问。您可以如下定义二维向量:

    vector< vector<int> > nodes;
    

    其中节点 ID 为 0 到 number_of_nodes -1; 节点 6 将存储在节点 [6] 中,然后继续。

    【讨论】:

      猜你喜欢
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 1970-01-01
      相关资源
      最近更新 更多