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

时间:2015-06-12 21:43:02

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

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

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

node_index, node_degree, X, Y , Z.

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

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

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

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

请您提供我应该学习实施的相关主题的链接吗?

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

1 个答案:

答案 0 :(得分:2)

我建议您使用 INSERT INTO place_menu (menu_ref_place, menu_name, menu_price, menu_card_price, menu_full_price, menu_desc) VALUES ('1', 'adasd'asdasd', '2', '3.80', '400', 'asdasda sasdasda s0d8aèsdaysd8sd8asdèa0sd8yè0=?£!(/\"=)(!?)(\"?!)\"') Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'asdasd', '2', '3.80', '400', '<b>asdasda s</b>asdasda s0d8a?sdaysd8sd8asd?a0sd8y' at line 1' in /home/contat13/public_html/app/menu/app/inc/db.cl.php:36 Stack trace: #0 /home/contat13/public_html/app/menu/app/inc/db.cl.php(36): PDO->query('INSERT INTO pla...') #1 /home/contat13/public_html/app/menu/app/inc/db.cl.php(146): DB->sql_query('INSERT INTO pla...') #2 /home/contat13/public_html/app/menu/insert_dish.php(15): DB->insert('place_menu', Array, false) #3 {main} thrown in /home/contat13/public_html/app/menu/app/inc/db.cl.php on line 36 结构来表示图表中的边缘

Link

然后每个节点都可以包含

struct Link
{
  Node *N;
  float weight;
}

这样就没有重复的节点。存在权重重复,因为如果节点A具有指向节点B的链路,则节点B具有指向节点A的相同权重的链路。如果重复的重复是一个问题(例如,如果图形是如此大权重的存储是昂贵的,或者如果权重经常更新),那么你可以使链接双向(两个vector<Link> neighbors; 和一个权重)并给每个节点

Node*

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