没有炸弹的最小路径

时间:2015-09-09 16:41:21

标签: algorithm data-structures graph shortest-path

给出尺寸为N×M的2-D矩阵。每个单元格中的数据表示穿过单元格的时间。一些块包含表示炸弹的负值。我们需要找到从[0,0]到达[n-1,m-1]的最短时间而不经过任何炸弹。

  • 我需要在这里做BFS还是Dijkstra?如果我做BFS,它如何确定最短的时间/最短时间?
  • 如果我做Dijkstra,我如何获得从[0,0]单元格到[n-1,m-1]的路径。

示例矩阵:

                        {0, 4, -1, -1, -1, -1, -1, 8, -1},
                        {4, 0, 8, -1, -1, -1, -1, 11, -1},
                        {-1, 8, 0, 7, -1, 4, -1, -1, 2},
                        {-1, -1, 7, 0, 9, 14, -1, -1, -1},
                        {-1, -1, -1, 9, 0, 10, -1, -1, 1},
                        {-1, -1, 4, -1, 10, 0, 2, -1, -1},
                        {-1, -1, -1, 14, -1, 2, 0, 1, 6},
                        {8, 11, -1, -1, -1, -1, 1, 0, 7},
                        {-1, -1, 2, -1, -1, -1, 6, 7, 0}

2 个答案:

答案 0 :(得分:2)

如果2D矩阵是图形,那么每条边的遍历成本是相同的。在这种情况下,Djikstra等同于BFS。由于每个单元格的交叉成本不同,因此Djikstra在这里并不等同于BFS。 BFS将确定穿越所需的最小细胞数,但不是最小时间。所以要求是Djiksta的。这回答了您的第一个问题。

我假设您知道如何实施Djikstra。您面临的问题是如何在这个问题上实现它。为此,您需要将2D矩阵表示为图形。产生的主要问题是如何捕获图中节点值的关系。这可能是因为您习惯于考虑边缘上的权重,而不是顶点上的权重。但是,你可以简单地将问题减少到Djikstra,使其成为有向图,其中从[i][k][j][k]的边缘成本为[j][k]的值,以及向后方向的边缘成本为[i][k]的值。要结合炸弹的概念,不要为这些细胞生成顶点。在此之后,应用Djikstra应该是直截了当的。

答案 1 :(得分:1)

从2D网格创建图形(每个位置都是一个节点,边缘到上方,下方,右侧和左侧的位置。炸弹位置只是不进入),但是在您完成初始化之后创建,使用第2步:

假设节点(x,y)的值为8,可以从四个节点访问(在网格中:一个在上面,右边,左边和下面)。您将节点转换为4个节点 - 一个节点与每个邻居相邻,这四个节点在它们之间连接(clique),边缘值为8.

在所有图表上完成此操作后,运行Dijkstra ...