[python]最小传输时延(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的最短距离。

  1. 我们建立一个集合s,把起始点i放进去,然后在与i相邻的边中寻找与i距离最近的点,并把这个点放到集合中去。
  2. 然后第二次遍历与集合中的点相连的点,并更新到起始点的距离,并把距离起始点i最近的点放到集合中去。
  3. 继续上面的做法,每次都在集合中添加一个点。直到没有新的点可以添加进去。

我们来写一个比较简单的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 not u and (x == -1 or dist[y] < dist[x]): #只考虑没有使用过的节点,寻找结点们到初始点的最小距离。
        # 毫无疑问,在第一次遍历中,这个距离是0,目标点是我们的源点本身。
            x = y  # 如果距离小,就用新的点替换掉x。

    used[x] = True # 每次都使用距离源点最近的点
    for y, time in enumerate(g[x]):
        dist[y] = min(dist[y], dist[x]+time)  # 更新相连的结点到源点的距离

ans = max(dist)  # 这就是我们要求的k到最远的点的最小距离

dijkstra的时间复杂度是$O(N^2)$.

这个题也可以用dfs的方法来作,遍历到父结点时,更新所有的子结点到源点的距离。dfs解该题的时间复杂度更高一点,是 $O(N^N)$.
同样给出一个解法代码。

map_dict = defaultdict(list)
for u, v, w in distance:
    map_dict[u].append([v,w])  

dist = [float('inf')] * n
def dfs(index, dis):
    if dis < dist[index-1]:
        dist[index-1] = dis
        for v, w in map_dict[index]:
            dfs(v,dis+w)
dfs(k,0)

res = max(dist)

python解答

我们回到题目的python解答上。

dfs解法

首先我们给出一个dfs的解答。
可以看到这个解法和上面的dfs几乎一模一样,区别是这里返回的是源节点到目标点的距离。

def solution(times,src, dist):
    graph = {
   }
    for u,v, w in times:
        if u not in graph:
            graph[u] = []
        graph[u].append([v,w])

    root = [float('inf')]*N    
    def dfs(index, dis):

        if dis<root[index-1]:
            root[index-1] = dis
            if index in graph:
                for u, v in graph[index]:
                    dfs(u,dis+v)

    dfs(src,0)
    res = root[dist-1]
    return res if res!=float('inf') else -1

dijkstra解法

这个解法也是和上面的思路一样,只不过在发现x==dis-1的时候,提前break结束了这个循环。

def solution(times, src, dis):
    g = [[float('inf')]*N for _ in range(N)]
    for u,v, time in times:
        g[u-1][v-1] = time

    dist = [float('inf')]*N
    dist[src-1] = 0
    used = [False]*N
    for i in range(N):
        x = -1
        for y, u in enumerate(used):
            if not u and (x==-1 or dist[y]< dist[x]):
                x = y
        if x == dis-1:
            break
        used[x] = True
        for y, time in enumerate(g[x]):
            dist[y] = min(dist[y],dist[x]+time)

    return dist[dis-1]
相关文章
|
1天前
|
机器学习/深度学习 人工智能 算法
食物识别系统Python+深度学习人工智能+TensorFlow+卷积神经网络算法模型
食物识别系统采用TensorFlow的ResNet50模型,训练了包含11类食物的数据集,生成高精度H5模型。系统整合Django框架,提供网页平台,用户可上传图片进行食物识别。效果图片展示成功识别各类食物。[查看演示视频、代码及安装指南](https://www.yuque.com/ziwu/yygu3z/yhd6a7vai4o9iuys?singleDoc#)。项目利用深度学习的卷积神经网络(CNN),其局部感受野和权重共享机制适于图像识别,广泛应用于医疗图像分析等领域。示例代码展示了一个使用TensorFlow训练的简单CNN模型,用于MNIST手写数字识别。
14 3
|
1天前
|
算法 Python
Python中实现图论算法
Python中实现图论算法 “【5月更文挑战第20天】”
11 3
|
6天前
|
算法 搜索推荐 C语言
Python实现数据结构与算法
【5月更文挑战第13天】学习数据结构与算法能提升编程能力,解决复杂问题,助你面试成功。从选择资源(如《算法导论》、Coursera课程、LeetCode)到实践编码,逐步学习基本概念,通过Python实现栈、队列和快速排序。不断练习、理解原理,探索高级数据结构与算法,参与开源项目和算法竞赛,持续反思与实践,以提升技术能力。
6 0
|
6天前
|
机器学习/深度学习 算法 数据可视化
Python 数据结构和算法实用指南(四)(4)
Python 数据结构和算法实用指南(四)
14 1
|
6天前
|
机器学习/深度学习 存储 算法
Python 数据结构和算法实用指南(四)(3)
Python 数据结构和算法实用指南(四)
15 1
|
6天前
|
存储 算法 搜索推荐
Python 数据结构和算法实用指南(四)(2)
Python 数据结构和算法实用指南(四)
10 0
|
6天前
|
存储 算法 Serverless
Python 数据结构和算法实用指南(四)(1)
Python 数据结构和算法实用指南(四)
14 0
|
6天前
|
存储 算法 搜索推荐
Python 数据结构和算法实用指南(三)(4)
Python 数据结构和算法实用指南(三)
11 1
|
6天前
|
存储 搜索推荐 算法
Python 数据结构和算法实用指南(三)(3)
Python 数据结构和算法实用指南(三)
10 1
|
6天前
|
存储 算法 前端开发
Python 数据结构和算法实用指南(三)(2)
Python 数据结构和算法实用指南(三)
10 1