明天就要面试了我也太紧张了吧
但是终于找到了一个比较好理解的dijkstra的python解法,让我快点把它背下来!!!!
题目
先把题目放出来
某通信网络中有N个网络结点,用1到N进行标识。网络通过一个有向无环图表示,其中题的边的值表示结点之间的消息传递时延。现给定相连节点之间的时延列表 times[i] = {u,v,w},其中u表示源节点,v表示目的节点,w表示u和v之间的消息传递时延。
请计算给定源结点到目的结点的最小传输时延,如果目的结点不可达,返回-1。
输入描述:
输入的第一行为两个正整数,分别表示网络结点的个数N以及时延列表长度M,用空格分隔。
接下来的M行为两个结点间的时延列表[u,v,w]
输入的最后一行为两个正整数,分别表示源结点和目的结点。
比如:
| 输入 | 3 3 1 2 11 2 3 13 1 3 50 1 3 |
|---|---|
| 输出 | 24 |
一个有向无环图,用dfs也很好做。这里我们重点看一下dijkstra怎么做。
dijkstra算法的python实现
最短路径算法Dijkstra,主要思想是贪心。每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。
更具体地来说:
假设我们现在在一个有权图中,图中有n个点,点与点相连的路径上都分配有权重,代表了两点之间的距离。现在有一个起始点i,终点j,如果求i到j的最短距离。
- 我们建立一个集合s,把起始点i放进去,然后在与i相邻的边中寻找与i距离最近的点,并把这个点放到集合中去。
- 然后第二次遍历与集合中的点相连的点,并更新到起始点的距离,并把距离起始点i最近的点放到集合中去。
- 继续上面的做法,每次都在集合中添加一个点。直到没有新的点可以添加进去。
我们来写一个比较简单的python实现。
假设现在有n个节点,同时有一个输入distance距离列表,里面的元素表示的是[u,v,w]即u到v的距离。现在给定起点k,求k到最远的点的最小距离
dist = [float('inf')]*n # 构建一个列表存放n个结点到目标k的距离
dist[k-1] = 0 # 第k个结点到他本身的距离为0
g = [[float('inf')] * n for _ in range(n)] # 构建一个矩阵,表示n个结点彼此的距离。
for x, y, dis in distance:
g[x-1][y-1] = time # 按照distance列表更新矩阵中两两结点的距离。
used = [False]*n # 判断点是否已经加入了set里面。
for _ in range(n):
x = -1
for y, u in enumerate(used):
if

文章介绍了Dijkstra算法的Python实现,用于找到有向无环图中给定源节点到其他节点的最短路径。它通过贪心策略每次扩展最近的未访问节点。此外,还提到了DFS作为另一种解法,但其时间复杂度较高。文章提供了两种方法的代码实现,并讨论了它们的时间复杂度。
最低0.47元/天 解锁文章
1719

被折叠的 条评论
为什么被折叠?



