【问题标题】:undirected weighted graph data structure in c++C ++中的无向加权图数据结构
【发布时间】:2015-06-12 21:43:02
【问题描述】:

我正在学习 C++,感谢您通过回答我的问题来帮助我理解基本概念的支持。我确信我需要学习很多东西,但我需要一些建议来帮助我找到正确的方法。 我遇到的问题在下面解释。

我想实现一个类以在 C++ 中创建图形。正如我所注意到的,我可以使用矩阵,但我对矩阵不感兴趣,正如您稍后会看到的那样。 该图是无向的和加权的。该图是节点向量,我使用标准库向量。 图的每个节点(顶点)都有以下参数和一些邻居。

node_index, node_degree, X, Y , Z.

邻居也是节点,我可以为它们定义一个节点向量。 但是,我不喜欢创建节点向量有 3 个原因。 首先,我不需要

Y,Z
来自邻居。我还需要这个节点和它的每个邻居之间的权重。 其次,我需要分别计算每个节点的node_degree,X,如果我有重复的节点作为邻居,我需要手动更新它们,这是额外的工作。 第三,图表会很大,我不想将宝贵的内存浪费在无用的信息上。

话虽如此,我正在考虑创建一个基类,以后我可以从中派生 Node 类和 Neighbor 类。然后对于邻居,我保留一个指向每个邻居开头的指针向量。 我不知道怎么做,但我想我可以将该指针转换为基类,通过使用它,我可以从相邻节点检索我需要的信息。

换句话说,我试图保持指向邻居的指针,当我更新邻居参数时,我直接使用指针访问节点的最新信息。

能否提供我应该学习实施的相关主题的链接?

如果这是一个非常糟糕的主意(通过解释问题),请告诉我什么是更好或最好的方法。

【问题讨论】:

  • 我没有使用过 Boost Graph,但一般来说,当 Boost 中有一个子库可以做你想做的事情时,至少看看它是个好主意。
  • 您的问题中没有特定于 C++ 的内容。有许多方法可以对图数据结构进行编码,每种方法都有其优点和缺点,通常是空间和遍历速度之间的权衡。我的建议是研究数据结构并选择与您想要使用的数据结构相匹配的数据结构,只有在确定数据结构后,才能考虑用 C++ 实现它。

标签: c++ class c++11 data-structures graph


【解决方案1】:

我建议你使用Link 结构,来表示图中的一条

struct Link
{
  Node *N;
  float weight;
}

那么每个Node可以包含

vector<Link> neighbors;

这样就没有节点重复了。存在权重重复,因为如果节点 A 有一个指向节点 B 的链接,那么节点 B 有一个指向节点 A 的具有相同权重的链接。如果该权重的重复是一个问题(例如,如果图太大权重的存储很昂贵,或者如果权重经常更新),那么您可以使 Link 双向(两个 Node* 和一个权重)并给每个节点

vector<*Link>

这种情况下代码会稍微复杂一些,但这是效率的代价。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 2010-11-26
  • 2012-01-20
相关资源
最近更新 更多