简体   繁体   English

Dijkstra 算法 Python

[英]Dijkstra's algorithm Python

Given a graph and a source vertex in the graph, find the shortest paths from source to all vertices in the given graph.给定一个图和图中的一个源顶点,找到从源到给定图中所有顶点的最短路径。 Read more here -> Link在这里阅读更多-> 链接

Please go through my code and help me out by pointing what's wrong with my logic.请通过我的代码 go 并通过指出我的逻辑有什么问题来帮助我。

My code:我的代码:

from collections import defaultdict

global INT_MAX
INT_MAX = 3 ** 38


class Graph:
    def __init__(self, numofVertices):
        self.vertList = defaultdict(list)
        self.numofVertices = numofVertices

    def addEdge(self, u, v, cost):
        self.vertList[u].append((v, cost))
        self.vertList[v].append((u, cost))

    def minDist(self, dist, visited):
        
        for v in range(self.numofVertices):
            if dist[v] < INT_MAX and v not in visited:
                minIndex = v
        return minIndex

    def dijsktra(self, src):
        dist = [INT_MAX] * self.numofVertices
        dist[src] = 0
        visited = set()

        for _ in range(self.numofVertices):
            minVertex = self.minDist(dist, visited)

            visited.add(minVertex)

            for nbr, edgeCost in self.vertList[minVertex]:
                if dist[nbr] > dist[minVertex] + edgeCost and nbr not in visited:
                    dist[nbr] = dist[minVertex] + edgeCost
        return dist


g = Graph(9)
g.addEdge(0, 1, 4)
g.addEdge(0, 7, 8)
g.addEdge(1, 7, 11)
g.addEdge(7, 8, 7)
g.addEdge(7, 6, 1)
g.addEdge(7, 1, 11)
g.addEdge(1, 2, 8)
g.addEdge(2, 3, 7)
g.addEdge(2, 5, 4)
g.addEdge(2, 8, 2)
g.addEdge(6, 8, 6)
g.addEdge(6, 5, 2)
g.addEdge(5, 2, 4)
g.addEdge(5, 3, 14)
g.addEdge(5, 4, 10)
g.addEdge(3, 4, 9)
print(g.dijsktra(0))

Current Output:当前 Output:

[0, 4, 15, 25, 21, 11, 9, 8, 15] # Index represents the vertex

Expected Output预计 Output

[0, 4, 12, 19, 21, 11, 9, 8 ,14]

Here's the graph we are solving:这是我们正在解决的图表: 在此处输入图像描述

The problem was with the function that checks the min distance, We need to update the current max so that we can compare it with other unvisited vertices and see if another vertex exists with a lesser value.问题出在检查最小距离的 function 上,我们需要更新当前的最大值,以便我们可以将其与其他未访问的顶点进行比较,并查看是否存在另一个具有较小值的顶点。

def minDist(self, dist, visited):
    max1 = 3 ** 38
    minIndex = 0
    for v in range(self.numofVertices):
        if dist[v] < max1 and v not in visited:
            max1 = dist[v]
            minIndex = v
    return minIndex

There is an error in minDist method. minDist方法有错误。 It returns the index of first adjacent index, not the one with minimal distance.它返回第一个相邻索引的索引,而不是距离最小的索引。

This function should look like:这个 function 应该如下所示:

def minDist(self, dist, visited):
    m = INT_MAX
    for v in range(self.numofVertices):
        if dist[v] < m and v not in visited:
            m = dist[v]
            minIndex = v 
    return minIndex

Also, I am not sure that you have to assign both vertList[u] and vertList[v] in addEdge .另外,我不确定您是否必须在 addEdge 中同时分配vertList[u]addEdge vertList[v]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM