如何在O(mn)中找到最短路径

时间:2019-01-10 08:03:24

标签: shortest-path

给定大小为matrix A的{​​{1}},对于所有i,j,我们拥有(n*m)aij=1,如果aij=0被称为“黑色”,否则为“白色”,两点aij=1p(i,j)之间的距离定义如下:         q(k,l)

d(p,q)=|i-k|+|j-l|时间内是否运行任何算法来找到所有白点的白点及其最近的黑点?

O(mn)

2 个答案:

答案 0 :(得分:1)

我认为我们在同一所大学。 我认为永仁的答案不正确。您的答案只能覆盖黑人的上,下,左,右,如果白人的上,下,左,右都没有黑色,那将是错误的最短距离。

这是我的答案:

dp1[i][j] = min(dp1[i-1][j], dp1[i][j-1])+1 if A[i][j]=1 else 0
dp2[i][j] = min(dp2[i-1][j], dp2[i][j+1])+1 if A[i][j]=1 else 0
dp3[i][j] = min(dp3[i+1][j], dp3[i][j-1])+1 if A[i][j]=1 else 0
dp4[i][j] = min(dp4[i+1][j], dp4[i][j+1])+1 if A[i][j]=1 else 0

res[i][j] = min(dp1[i][j], dp2[i][j], dp3[i][j], dp4[i][j])

答案 1 :(得分:0)

我遇到同样的问题。你明天准备算法考试吗?

我的想法如下。

    let res[m][n] be new array // it restore shortest path between (m,n) and neast black point, if A[m,n] is black, res[m][n] should be zero.
    InitQueue(Q) 

    // init
    for i=1 to m
        for j=1 to n
            if A[i][j] == 1
                res[i][j] = 0
                push(Q, (i, j)) // (i, j) is a location, like tuple in python
            else
                res[i][j] = ∞

    while Q!=Ø
        (i, j) = pop(Q)
        for each location (u, v) ∈ Adjacent(i, j) // top、bottom、left、right
            if res[u, v] > res[i][j]+1
                push(Q, (u, v))  // I ignored before
                res[u][v] = res[i][j]+1

-----更新-----

感谢@ matrix123指出我的错误,我修改了答案并欢迎您 再次审核。

我的声誉不超过50,在这里仅评论matrix123的答案。

首先,您有一个小错误,“ if A [i] [j] = 1 else 0”应替换为“ if A [i] [j] = 0 else 0”,因为如果A [i] [j ] = 1('black'),我们知道最远距离直接为0。

第二,我不知道您首先循环哪个节点,“黑色”节点?您的终止条件是什么?期待您的完整代码。

这个问题的讨论很有趣。