C++ 中的无向加权图数据结构

undirected weighted graph data structure in c++

本文关键字:加权图 数据结构 C++      更新时间:2023-10-16

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

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

node_index, node_degree, X, Y , Z.

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

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

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

换句话说,我试图保留指向邻居的指针,

当我更新邻居参数时,我直接使用指针访问节点的最新信息。

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

请让我知道这是否是一个非常糟糕的主意(通过解释问题)以及这样做的更好或最好的方法是什么。

我建议你使用Link结构来表示图中的边缘

struct Link
{
  Node *N;
  float weight;
}

然后每个节点可以包含

vector<Link> neighbors;

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

vector<*Link>

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