首先,一些背景信息:我正在构建一个简单的图形类和基本的图形算法(Dijkstra、Floyd-Warshall、Bellman-Ford等),以便在即将到来的编程竞赛中作为参考资料使用。
到目前为止,我已经有了一个功能齐全的Floyd-Warshall版本,但缺点是到目前为止它只能让我得到两个节点之间的最短距离值,而不是最短路径。最好的情况是在算法本身内进行路径构建,而不是调用另一个函数来重构它。
这里有一些关于我使用的数据结构的信息:
到目前为止,我已经有了一个功能齐全的Floyd-Warshall版本,但缺点是到目前为止它只能让我得到两个节点之间的最短距离值,而不是最短路径。最好的情况是在算法本身内进行路径构建,而不是调用另一个函数来重构它。
这里有一些关于我使用的数据结构的信息:
vector< vector<int> > graph //包含从每个节点到其他每个节点的距离值(如果没有边,则graph [1] [3]包含从节点#1到节点#3的边长,值为INF
vector< vector<int> > path //包含到达给定节点的“跳板”。path [st_node] [end_node]包含从end_node -> st_node的下一个节点的值
这是我使用的示例图形数据:INF 10 INF INF INF INF
INF INF 90 15 INF INF
INF INF INF INF INF 20
INF INF INF INF 20 INF
INF INF 5 INF INF INF
INF INF INF INF INF INF
这里是期望的数值,应该在“路径”变量中(通过从每个节点运行Dijkstra获得):
INF 0 4 1 3 2
INF INF 4 1 3 2
INF INF INF INF INF 2
INF INF 4 INF 3 2
INF INF 4 INF INF 2
INF INF INF INF INF INF
这是我目前正在使用的算法代码链接: (通过PasteBin)。
非常感谢您的任何帮助!
编辑: 我尝试使用维基百科的代码来生成路径矩阵,以下是结果:
INF INF 4 1 3 4
INF INF 4 INF 3 4
INF INF INF INF INF INF
INF INF 4 INF INF 4
INF INF INF INF INF 2
INF INF INF INF INF INF
它有点能用,但在表示“单个”步骤时存在问题。例如,从节点0到节点1的路径在任何地方都是未定义的。(但仍然感谢Nali4Freedom的建议)
graph
的第一行,只有一个从节点#0出发的边,它通向节点#1。因此,path
的第一行(或者可能是第一列)应该是Inf 1 1 1 1 1
。我错过了什么吗? - Betagraph
中,每一行列出了从该节点离开的边,而在path
中,每一行包含到达node #[row_num]
的路径。例如,正确的path
图表的第一行表示从节点5(列=5)到达节点0(行=0)时,下一个回程的节点是节点2。要从节点2到达节点0,我们使用节点4,然后是节点3、节点1,最后到达目的地节点0。 - Mr. Llama