Mr.*_*ama 5 c++ algorithm graph floyd-warshall
首先,一点背景:我正在努力构建一个简单的图形类,其中包含基本图形算法(Dijkstra,Floyd-Warshall,Bellman-Ford等),以用作即将到来的编程竞赛的参考表.
到目前为止,我有一个功能版本的Floyd-Warshall,但缺点是到目前为止它只能让我获得两个节点之间的最短距离值,而不是最短路径.我希望在算法本身内进行路径构建,而不是必须调用另一个函数来重构它.
以下是我正在使用的数据结构的一些信息:
vector< vector<int> > graph //contains the distance values from each node to each other node (graph[1][3] contains the length of the edge from node #1 to node #3, if no edge, the value is INF
vector< vector<int> > path //contains the "stepping stones" on how to reach a given node. path[st_node][end_node] contains the value of the next node on the way from 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
Run Code Online (Sandbox Code Playgroud)
这里是"path"变量中的所需值(通过从每个节点运行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
Run Code Online (Sandbox Code Playgroud)
这是我目前用于算法的代码的链接:( 通过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
Run Code Online (Sandbox Code Playgroud)
它有点起作用,但在表示"单一"步骤方面存在问题.例如,从节点0到节点1的路径在任何地方都是未定义的.(但是,谢谢Nali4Freedom的建议)
好哇!
我仔细观察了添加维基百科代码片段的结果,并想出了一个适配器将其结果转换为我的结果,而无需调用单独的函数:
// Time to clean up the path graph...
for (int st_node = 0; st_node < this->size; st_node++)
{
for (int end_node = 0; end_node < this->size; end_node++)
{
int mid_node = this->path[st_node][end_node];
if (mid_node == INF)
{
// There is no mid_node, it's probably just a single step.
if (this->graph[st_node][end_node] != INF)
{
this->path[st_node][end_node] = st_node;
}
} else {
// The mid_node may be part of a multi-step, find where it leads.
while (this->path[mid_node][end_node] != INF)
{
if (this->path[mid_node][end_node] == mid_node) { break; } // Infinite loop
if (this->path[mid_node][end_node] == INF) { break; } // Dead end
mid_node = this->path[mid_node][end_node];
}
this->path[st_node][end_node] = mid_node;
} // IF mid_node
} // FOR end_node
} // FOR st_node
Run Code Online (Sandbox Code Playgroud)
(mid_node == INF)本质上,这通过添加边(如果原始图中存在)来补偿从节点 A 到节点 B 的单步操作。或者,如果它指向的节点只是通往目标节点的垫脚石,(this->path[mid_node][end_node] != INF)那么它会进行挖掘,直到找到它通向的位置。
感谢大家的帮助,我想我只是需要有人大声思考!
| 归档时间: |
|
| 查看次数: |
3627 次 |
| 最近记录: |