找到一些条件最短的路径

时间:2015-01-19 17:16:46

标签: algorithm graph graph-algorithm

让我来介绍一下这个问题:

你有一个二维码(QR码在这个问题上总是一个正方形),就像这个一样 one http://img11.hostingpics.net/pics/514457code.png
你可以从QR码顶部的任何地方开始(所以在第一行的任何地方),你必须找到一条路径到达底线的任何地方(所以在最后一行的任何地方)。

您必须尽量减少路径中的黑色案例数量,如果您有多条路径具有相同数量的黑色案例,则必须找到最短的案例。

solution的示例:

找到一个算法来找到那些条件的最短路径。

我的解决方案

首先,我将问题视为有向网格图,其中每个像素都是一个顶点,每个顶点都有与邻居一样多的边。

因此,例如,左上角的顶点可以到达其右邻居及其底部邻居。

我将边缘的权重归属如下:

  • 对于从白色外壳到黑色外壳的边缘 - >重量为1
  • 对于从白色表壳到白色表壳的边缘 - >权重0 +小值
  • 对于从黑色外壳到白色外壳的边缘 - > wieght of 0 + a small value
  • 对于从黑色外壳到黑色外壳的边缘 - >重量为1

在我们有几条具有相同黑色案例数量的路径的情

因此,使用此表示法,令V为顶点数,W为一行中顶点数,E为边数,我们有E = W(W-1)* 2 * 2.

然后我创建了2个子集:第一个包含所有可能的起始顶点(QR码的第一行,所以是W顶点),另一个包含可能的最终目的地(最后一行,因此是W顶点)。

我使用Dijkstra来计算O(V lg(V))中的最短路径(使用我使用的库),我为所有起始节点做了W次,我寻找到每个目标顶点的最短路径。

所以我找到O(V * W lg(V))= O(V ^ 3/2 Lg(V))的最短路径。

问题

你有更好的解决方案吗?使用网格图表示或其他什么?

1 个答案:

答案 0 :(得分:1)

这是一个更快的解决方案:

  1. 让我们找到包含最少数量黑色单元格的路径。我们可以使用0-1广度优先搜索。导致白色单元格的边缘应具有权重0,并且通向黑色单元格的边缘应具有权重1。不需要分别从顶行的每个顶点运行它:我们可以在开始时将它们全部添加到队列中,然后只运行一次广度优先搜索(我们不应该忘记添加所有白色单元格)黑色之前的第一行)。

  2. 如果u,我们可以调用从vdist[v] == dist[u] + weight(u, v)的有向边缘。现在,我们可以在仅包含“良好”边缘的图形上运行简单的广度优先搜索(再次,来自批处理中顶行的所有单元格)(这次所有边缘都具有权重1)。

  3. 现在我们可以选择最后一行中最好的单元格。

  4. 这个解决方案需要O(V)时间(它只有两个广度优先搜索)并且它总能产生最佳答案(不需要小的幻数)。