关于如何处理有向图的一个想法
An idea as to how to approach a directed graph
我正在尝试使用有向图(我知道但从未实现过)编写一个程序来模拟交通网络。
用户将输入一个行星名称,后跟一个表示图形中总节点数的整数。然后,用户将逐一浏览每个节点。他们会给它一个名称,给出节点的邻居数量,然后给出具体的名称。输入将如下所示。
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 2 3 4 1 0 1 1 0 2 0 0 0 1 3 0 0 0 1 4 1 0 0 0
-
如果你使用邻接矩阵,我认为
breadth-first search
可能是一个很好的选择,因为它很容易理解和实现。同时,您需要一个队列来存储下一个要检查的节点,以及一个列表来存储哪些节点已经被检查例如,如果要检查
node1
无法到达的节点,只需检查第1行,就会发现它有2
和3
,并将2
和3
放入队列。然后检查行2
以查看它是否有4
,将2
放入列表,并将4
放入队列。然后只需使用for循环来执行相同的操作。最后,您只需要检查哪些节点不在列表中。
如果你不想重新发明轮子,你也可以使用Boost::Graph。。。
相关文章:
- 为什么 QXmlQuery 似乎在结果中添加了一个""?(以及如何解决它?
- 如何编写一个类似于kernellist_head的c++风格的双链表实现
- 在 c++ 中,同一类的一个对象如何分配给同一类的另一个对象?
- 一个流如何与另一个冲洗的流相关联?
- 如何将一个函数乘/除到另一个函数?如何使用参数?
- 如何从同一个头文件中定义 2 个类,而一个类依赖于另一个类
- 我无法使用 c++(代码块)中的 fstream 将文件内容复制到另一个。如何运行该文件?
- 指针和将变量值从一个函数传递到另一个函数.如何使用指针传递变量值
- 我如何归因于迭代器的另一个迭代
- 如何使用类型专用化模板方法,该类型本身就是一个模板,其中只有返回类型依赖于模板类型
- 是否有一个示例如何使用SWIG生成GO Build的C Buidings
- 需要一个关于如何使用QThreadPool的工作示例
- 一个类如何声明其所有可变模板参数friends
- 一个单元如何测试C++序列的所有路径(单个或多个函数或类)
- 将空格字符添加到附加的每个项目,以必须擦除最后一个项目.如何改进
- 另一个对象所包含的一个对象如何可以更改容器对象的私有数据成员
- 一个类如何知道他的一个变量中是否发生了什么?
- 一个类如何知道其成员的大小?
- 有一个字符串如何从第一个' /r/n/r/n '得到它的内容,直到2行从字符串结束
- 每次打印一个字母.如何