【问题标题】:Find a shortest path with some conditions在某些条件下找到最短路径
【发布时间】:2015-01-19 17:16:46
【问题描述】:

让我介绍一下问题:

你有一个像这个一样的二维码(二维码在这个问题中总是一个正方形)。
one http://img11.hostingpics.net/pics/514457code.png
您可以从 QR 码顶部的任何位置开始(因此在第一行的任何位置),并且您必须找到到达底线任何位置的案例的路径(因此在最后一行的任何位置)。

你必须尽量减少路径中的黑格数,如果你有几条黑格数相同的路径,你必须找到最短的那一个。

solution 的示例:

找到一种算法来找到满足这些条件的最短路径。

我的解决方案

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

例如,左上角的顶点可以到达它的右邻居和它的下邻居。

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

  • 对于从白色外壳到黑色外壳的边缘 -> 重量为 1
  • 对于从白盒到白盒的边缘 -> 权重 0 + 小值
  • 对于从黑色外壳到白色外壳的边缘 -> 宽度为 0 + 一个小值
  • 对于从黑色外壳到黑色外壳的边缘 -> 重量为 1

这里有一个小值(

因此,对于这种表示,令 V 为顶点数,W 为一条线中的顶点数,E 为边数,我们有 E = W(W-1)*2*2。

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

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

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

问题

你有更好的解决这个问题的方法吗?使用网格图表示或其他方式?

【问题讨论】:

    标签: algorithm graph graph-algorithm


    【解决方案1】:

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

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

    2. 让我们调用从uv 的有向边,如果dist[v] == dist[u] + weight(u, v) 很好。现在我们可以在只包含“好”边的图上运行简单的广度优先搜索(同样,从批次中顶行的所有单元格)(这次所有边的权重1)。

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

    这个解决方案需要O(V) 时间(它只是两个广度优先搜索),它总是产生一个最佳答案(不需要小的幻数)。

    【讨论】:

    • 不错的解决方案。但是面包优先搜索需要 O(E+V) 并且我们有 O(V^2) 边,(即使我们有一个无向图)。我误解你的算法了吗?
    • @XogoX 为什么你认为我们有 O(V^2) 边?每个顶点最多有 4 条出边,所以 E = O(V)。
    • 哦,对了,我倒了 W 和 V,你说得对,我们有 O(V) 边
    • 对了,这个0-1的BFS,是常用的把戏吗?它用于其他一些算法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多