提供额外权重边的无向图的最短路径

时间:2016-10-24 09:14:21

标签: java data-structures undirected-graph

我们提供了无向图,源节点,目标节点和额外边缘的权重,您可以使用它来连接之前未连接的任何两个节点。您必须找到源和目标之间可能路径的最小权重。您只能使用提供的边缘一次。 下面是一个示例:具有5条边的图形如下 1-> 2重量是1,2-> 3重量是2,3-> 4重量是3,4-> 5重量是1,1-> 4重量是3和源顶点是顶点1,目标是顶点4.我们必须告诉最小路径长度。 (在这种情况下是2) 我们可以使用额外的重量边缘1(这里从1到5) 我想知道如何在java中实现它。

2 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,那么你所寻找的就是java中广度优先搜索的实现,可以找到here。除非你使用额外的边缘来创建1到4之间的直接路径(即源和目的地),所以我没有看到额外边缘权重的任何用途(因为这只会增加距离),所以最短距离将变为1.但是,在每种情况下,如果此额外边缘的重量小于从广度优先搜索获得的重量,则必须检查。此外,在不使用额外边缘的情况下,最短距离在这种情况下为3,而不是2。

答案 1 :(得分:0)

假设您没有零边和负边。保持数组中的边a [N] [N]。 稍微修改图形:

  • 从源图中制作有向图A:

    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            if (a[i][j] > 0 && a[j][i] == 0)
                a[j][i] = a[i][j];
    
  • 制作图表副本并添加野边(野边被指示,从A部分到B部分,预定权重)

  • 定义数组b:int b [2 * N] [2 * N],用零初始化边

    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            if (a[i][j] == 0) {
                b[i][N+j] = wildWeight;
            } else {
                b[i][j] = a[i][j];
                b[N+i][N+j] = a[i][j];
            }   
    

谷歌在Java中实现Dijkstra算法,并在该中化图上使用它。

相关问题