algorithm - 如何找到顶点 i 和 j 之间最多有 S 个顶点的最小路径

标签 algorithm graph path dynamic-programming floyd-warshall

这是我实现 Floyd 算法的代码。我怎样才能改变这个算法来解决这个问题: 求顶点 i 和 j 之间至多 S 个顶点之间的最小距离。

void Floyd_Warshal(int graph[MAX][MAX], int D[MAX][MAX], int P[MAX][MAX], int numberOfNodes){
    for(int i = 0 ; i < numberOfNodes ; i++)
        for(int j = 0 ; j < numberOfNodes ; j++){
            D[i][j] = graph[i][j];
            P[i][j] = -1;
        }
    for(int k = 0 ; k < numberOfNodes ; k++)
        for(int i = 0 ; i < numberOfNodes ; i++)
            for(int j = 0 ; j < numberOfNodes ; j++)
                if(D[i][j] > D[i][k] + D[k][j]){
                    D[i][j] = D[i][k] + D[k][j];
                    P[i][j] = k;
                }
}

最佳答案

Bellman-Ford algorithm (略微修改的版本不使用当前迭代中找到的路径)在每次迭代中 i 可以找到最多使用 i 边的所有最短路径。 Floyd-Warshall 算法不是解决此类问题的合适方法。

可以修改Dijksta's algorithm同样,但它需要更改图形。修改后的图将包含 |V|*(S+1) 个顶点(对于每个顶点和每个可能的路径长度)。这answer对图的构造有详细的解释。

关于algorithm - 如何找到顶点 i 和 j 之间最多有 S 个顶点的最小路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44485051/

相关文章:

performance - 查找两个节点之间所有路径的高效算法

algorithm - 来自给定节点的最长路径近似算法

linux - Windows 和 Linux 下路径名的语法分别是什么?

algorithm - 如何过滤一组以某种方式移动的二维点

javascript - 如何通过算法为表格对 Angular 线的对 Angular 线着色

algorithm - 多父链接

algorithm - 最短路径 : DFS, BFS 或两者?

graph - Neo4J Cypher - 寻找两条路径的交汇点

java - 算法简单但内存不足

java - 解释一下为什么这个二叉树遍历算法的时间复杂度是O(NlogN)?