[华为OD] 最小传输时延(dijkstra算法)

明天就要面试了我也太紧张了吧

但是终于找到了一个比较好理解的dijkstra的python解法,让我快点把它背下来!!!!

文章目录

  • 题目
  • dijkstra算法的python实现
  • python解答
    • dfs解法
    • dijkstra解法

题目

先把题目放出来

某通信网络中有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 ) O(N^2) O(N2).

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

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]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/51086.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RNN架构解析——LSTM模型

目录 LSTMLSTM内部结构图 Bi-LSTM实现 优点和缺点 LSTM LSTM内部结构图 Bi-LSTM 实现 优点和缺点

Windows系统如何修改文件日期属性

winr键&#xff0c;输入powershell,在弹出的命令窗口输入命令&#xff0c;案例如下&#xff1a; file_address E:\_OrderingProject\\PIC1101\ldv1s_0830_ec_result.tiftime_change "07/12/2022 20:42:23" 修改文件创建时间&#xff1a;creationtime $(Get-Item fi…

STL 关于vector的细节,vector模拟实现【C++】

文章目录 vector成员变量默认成员函数构造函数拷贝构造赋值运算符重载函数析构函数 迭代器beginend size和capacityresizereserve[ ]push_backpop_backinserteraseswap vector成员变量 _start指向容器的头&#xff0c;_finish指向容器当中有效数据的下一个位置&#xff0c;_end…

Python零基础入门(九)——函数,类和对象

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python入门专栏&#xff1a;《Python入门》欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; 码字不易&#xff0c;如果觉得文章不…

❤️创意网页:萌翻少女心的果冻泡泡 - 创造生动有趣的视觉效果

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

【UE4】局域网多人联机 Demo

效果 亲测可以打包后在两个电脑上联机运行&#xff08;前提是在同一个局域网内&#xff0c;互相能ping通&#xff09; 步骤 1. 首先新建一个第三人称角色模板工程 2. 在多玩家选项中&#xff0c;设置玩家数量为2 选择在新建编辑器窗口中运行 3. 新建一个父类为Character的蓝…

【1.1】Java微服务:初识微服务

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; 微服务 ✨特色专栏&#xff1a; 知识分享 &#x…

大数据Flink(五十三):Flink流处理特性、发展历史以及Flink的优势

文章目录 Flink流处理特性、发展历史以及Flink的优势 一、Flink流处理特性 二、发展历史

数据结构入门指南:链表(新手避坑指南)

目录 前言 1.链表 1.1链表的概念 1.2链表的分类 1.2.1单向或双向 1.2.2.带头或者不带头 1.2.33. 循环或者非循环 1.3链表的实现 定义链表 总结 前言 前边我们学习了顺序表&#xff0c;顺序表是数据结构中最简单的一种线性数据结构&#xff0c;今天我们来学习链表&#x…

基于RK3588+AI的边缘计算算法方案:智慧园区、智慧社区、智慧物流

RK3588 AI 边缘计算主板规格书简介 关于本文档 本文档详细介绍了基于Rockchip RK3588芯片的AI边缘计算主板外形、尺寸、技术规格&#xff0c;以及详细的硬件接口设计参考说明&#xff0c;使客户可以快速将RK3588边缘计算主板应用于工业互联网、智慧城市、智慧安防、智慧交通&am…

联想拯救者如何开启独显直连

不同机型有不同的切换方式&#xff0c;下面就分别给大家讲一下&#xff1a; 显卡模式切换方式一&#xff1a; 打开联想电脑管家&#xff0c;选择游戏模式&#xff0c;在左侧菜单栏选择显卡模式&#xff0c;然后就能看到显卡的输出模式了&#xff0c;默认是混合模式&#xff0c…

MDK5__配色方案的修改

一、必要的知识 与MDK主题相关的文件有两个&#xff0c;在X:\Keil_v5\UV4路径下&#xff1a; global.propglobal.prop.def其中global.prop.def是系统默认的主题配置 如果修改过字体等&#xff0c;系统会生成一个global.prop。 二、修改的步骤 1、打开工程 菜单 Edit 下 Con…

【JavaEE】博客系统前后端交互

目录 一、准备工作 二、数据库的表设计 三、封装JDBC数据库操作 1、创建数据表对应的实体类 2、封装增删改查操作 四、前后端交互逻辑的实现 1、博客列表页 1.1、展示博客列表 1.2、博客详情页 1.3、登录页面 1.4、强制要求用户登录&#xff0c;检查用户的登录状态 …

【JVM】详解JVM的五大内存模型、可能出现的异常以及堆栈引用易错点

文章目录 1、堆(线程共享)2、方法区(线程共享)3、虚拟机栈&#xff08;线程私有&#xff09;4、本地方法栈(线程私有)5、程序计数器(线程私有)6、易错点 源自&#xff1a;深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践&#xff08;第3版&#xff09; 周志明 1、堆(线程…

使用克拉默法则进行三点定圆(二维)

目录 1.二维圆2.python代码3.计算结果 本文由CSDN点云侠原创&#xff0c;爬虫网站请自重。 1.二维圆 已知不共线的三个点&#xff0c;设其坐标为 ( x 1 , y 1 ) (x_1,y_1) (x1​,y1​)、 ( x 2 , y 2 ) (x_2,y_2) (x2​,y2​)、 ( x 3 , y 3 ) (x_3,y_3) (x3​,y3​)&#xf…

Ubuntu-文件和目录相关命令一

&#x1f52e;linux的文件系统结构 ⛳目录结构及目录路径 &#x1f9e9;文件系统层次结构标准FHS Filesystem Hierarchy Standard(文件系统层次结构标准&#xff09; Linux是开源的软件&#xff0c;各Linux发行机构都可以按照自己的需求对文件系统进行裁剪&#xff0c;所以众多…

Python - OpenCV实现摄像头人脸识别(亲测版)

要使用Python 3和OpenCV进行摄像头人脸识别&#xff0c;您可以按照以下步骤进行操作&#xff1a; 0.安装OpenCV软件 去官网直接下载安装即可,如果是C使用OpenCV&#xff0c;需要使用编译源码并配置环境变量。 1.安装OpenCV库 在命令行中输入以下命令&#xff1a; pip inst…

渗透测试基础知识(1)

渗透基础知识一 一、Web架构1、了解Web2、Web技术架构3、Web客户端技术4、Web服务端组成5、动态网站工作过程6、后端存储 二、HTTP协议1、HTTP协议解析2、HTTP协议3、http1.1与http2.0的区别4、HTTP协议 三、HTTP请求1、发起HTTP请求2、HTTP响应与请求-HTTP请求3、HTTP响应与请…

具有电动驱动的四足机器人模型研究(SimulinkMatlab代码)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

[NLP]LLM高效微调(PEFT)--LoRA

LoRA 背景 神经网络包含很多全连接层&#xff0c;其借助于矩阵乘法得以实现&#xff0c;然而&#xff0c;很多全连接层的权重矩阵都是满秩的。当针对特定任务进行微调后&#xff0c;模型中权重矩阵其实具有很低的本征秩&#xff08;intrinsic rank&#xff09;&#xff0c;因…
最新文章