CodeFights:Dijkstra的算法实现

时间:2016-03-27 05:50:48

标签: python algorithm graph-algorithm dijkstra

考虑到这个代码争夺问题:

  

考虑位于n个岛屿上的大城市。有连接岛屿的桥梁,但它们都只有单向交通。更糟糕的是,大多数桥梁在晚上关闭,所以最多只有一座桥梁可以从任何一个岛屿A流向任何其他岛屿。

     

有一个程序员通过夜班作为优步司机来赚一分钱。一天晚上,他拿起一个从0岛到岛屿(n-1)的骑手后,他的手机就死了。他有笔记本电脑中的城市桥梁地图(存储为距离矩阵),因此他决定实施一种算法,计算这两个岛屿之间的最短路径,并根据路径距离评估成本。假设旅程的每一英里都是1美元。

我决定实施Dijkstra算法来解决它:

def nightRoute(city):
    visited = [];
    visited.append(0);
    distance = [];
    for x in range(0, len(city)):
        distance.append(float("inf"));
    distance[0] = 0;

    while(len(visited) != len(city)):
        for i in visited:
            print visited;
            min = float("inf");
            minNode = -1;
            for j in range(0, len(city)):
                if ( j not in visited and city[i][j] != -1):
            if distance[j] > distance[i] + city[i][j]:
            distance[j] = distance[i] + city[i][j]
                    if distance[i] + city[i][j] <= min:
                        min = distance[i] + city[i][j];
                        minNode = j
            if(min != float("inf") and minNode != -1):
                visited.append(minNode);
    return distance[len(city)-1];

然而,当我运行代码时,它只传递了6/7个测试用例(最后3个测试用例对我来说是隐藏的,所以我不知道输入是什么)。

有人能告诉我dijkstra的实施有什么问题吗?我错过了dijkstras的工作方式吗?

1 个答案:

答案 0 :(得分:0)

您应该发现访问节点包含每次迭代中的最小密钥(距离),而不是尝试所有访问过的节点。尽管放松仍然是安全的,但您可能会将一些节点放在访问集上没有最佳密钥,从而影响结果。

此外,虽然我认为这不会改变结果,但最好避免使用==!=比较两个浮点数。