关于如何处理有向图的一个想法

An idea as to how to approach a directed graph

本文关键字:一个 于如何 处理 有向图      更新时间:2023-10-16

我正在尝试使用有向图(我知道但从未实现过)编写一个程序来模拟交通网络。

用户将输入一个行星名称,后跟一个表示图形中总节点数的整数。然后,用户将逐一浏览每个节点。他们会给它一个名称,给出节点的邻居数量,然后给出具体的名称。输入将如下所示。

some_planet 4
node1 2 node2 node3
node2 1 node4
node3 1 node4
node4 1 node1

然后我只输出node1无法到达的节点。然而,我对实现这一点有一些疑问。

1) 大的是储存这些东西。什么是简单的方法?我在考虑一个LinkedList,并认为我会链接位置。然后我可以根据输入的内容弹出指针。然而,我不知道如何完成最后一部分。

2) 下一个大问题是搜索图表。我计划进行递归深度优先搜索。你看到的这个算法有什么问题吗?不过,我需要以这种方式单独搜索每个节点,所以我必须增加它。我能把所有东西都放在一个for循环中吗?

recursive-d-first-search(graph G, node start, node find)
if(start == find)
return true;
else
for every neighbor n of start
success = recursive-d-first-search(graph G, node n, node find);
if(success)
return true;
return false;
  1. 我认为您只需要使用邻接矩阵来存储整个图的连接关系。在你的情况下,应该是这样的:

    1    2    3    4
    1   0    1    1    0
    2   0    0    0    1
    3   0    0    0    1
    4   1    0    0    0
    
  2. 如果你使用邻接矩阵,我认为breadth-first search可能是一个很好的选择,因为它很容易理解和实现。同时,您需要一个队列来存储下一个要检查的节点,以及一个列表来存储哪些节点已经被检查

    例如,如果要检查node1无法到达的节点,只需检查第1行,就会发现它有23,并将23放入队列。然后检查行2以查看它是否有4,将2放入列表,并将4放入队列。然后只需使用for循环来执行相同的操作。

    最后,您只需要检查哪些节点不在列表中。

如果你不想重新发明轮子,你也可以使用Boost::Graph。。。

相关文章: