图论-最短路径算法-弗洛伊德算法与迪杰斯特拉算法

news/2024/11/8 18:44:07/

弗洛伊德算法:

弗洛伊德算法本质是动态规划,通过添加点进如可选择的点组成的集合的同时更新所有点之间的距离,从而得到每两个点之间的最短距离。

  1. 初始化: 创建一个二维数组 dist,其中 dist[i][j] 表示从节点 i 到节点 j 的最短路径的权重。将对角线上的元素初始化为0,表示节点到自身的距离。如果存在直接相连的边,则将 dist[i][j] 初始化为这些边的权重;否则,初始化为一个大数表示无穷大。

  2. 三重循环: 对于每一对节点 (i, j),以及所有可能的中间节点 k,进行三重循环:

    plaintextCopy code

    for k from 1 to n: for i from 1 to n: for j from 1 to n: dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])

    在每一次迭代中,检查是否通过中间节点 k 能够获得更短的路径。如果 dist[i][k] + dist[k][j] 小于当前已知的 dist[i][j],则更新 dist[i][j]

  3. 输出结果: 算法结束后,矩阵 dist 中的元素即为图中所有节点对之间的最短路径。

迪杰斯特拉算法:

迪杰斯特拉算法是广度优先遍历算法的一种,遍历当前节点的所有邻接点,更新原点到邻接点的距离。最终得到原点到每个点的最小距离。

  1. 初始化: 创建两个数组,distancevisiteddistance 数组用于存储从起始节点到各个节点的当前最短路径长度,初始时将起始节点到自身的距离设置为0,其他节点的距离设置为无穷大。visited 数组用于标记节点是否已经被访问,初始时所有节点都未被访问。

  2. 选择起始节点: 将起始节点标记为当前的工作节点。

  3. 更新邻接节点的距离: 遍历当前工作节点的所有邻接节点,计算从起始节点经过当前工作节点到邻接节点的路径长度。如果这个路径长度小于 distance 数组中记录的邻接节点的当前最短路径长度,则更新 distance 数组。

  4. 选择下一个工作节点: 从未访问的节点中选择一个具有最小最短路径长度的节点,将其标记为当前的工作节点。如果所有未访问的节点都具有无穷大的最短路径长度,说明剩下的节点不可达,算法结束。

  5. 重复步骤3和4: 重复执行步骤3和步骤4,直到所有节点都被访问过。

案例题目

现在小丽在城镇A,小明在城镇B。小丽要出发找小明。

城镇之间有双向通行的道路,通过道路要消耗一定的时间。

其中已知城镇C和城镇D之间有双向的传送门,可以不消耗时间瞬间传送过去

现在请你求出小丽从城镇A抵达城镇B的最短时间。保证从起点到终点有路径可达。

输入描述

第一行两个正整数n,m,以空格分开,表示总共有n个城镇,有m条道路相连
第二行两个正整数A,B,以空格分开,分别表示小丽所在城镇A,小明所在城镇B。
第三行两个正整数C,D,以空格分开,表示城镇C和城镇D之间有瞬间的双向传送门。
接下来m行,每行三个正整数u,v, c,以空格分开,表示城镇u和城镇v之间有道路,通过道路消耗时间c。
对于100%的数据保证 1<=n <=100,1<=m<=2*n,每条道路的时间花费在[1,10]之间

输出描述

一行,一个整教表示最短到达时间。

样例输入

4 3
1 4
1 3
1 2 1
2 3 1
2 4 1

样例输出

2

代码 

弗洛伊德算法

n,m = map(int,input().split(" "))
A,B = map(int,input().split(" "))
print(A,B)
C,D = map(int,input().split(" "))
dis = [[float('inf') for i in range(n+1)] for j in range(n+1)]
for i in range(m):u,v,c = map(int,input().split(" "))dis[u][v] = cdis[v][u] = cdis[C][D] = dis[D][C] = 0for k in range(1,n+1):for i in range(1,n+1):for j in range(1,n+1):dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j])print(dis[A][B])

迪杰斯特拉算法

import collectionsn,m = map(int,input().split(" "))
A,B = map(int,input().split(" "))
C,D = map(int,input().split(" "))graph = [[] for _ in range(n)]
for i in range(m):u,v,c = map(int,input().split(" "))graph[u-1].append((v-1,c))graph[v- 1].append((u-1,c))graph[C-1].append((D-1,0))
graph[D-1].append((C-1,0))def dijkstra(graph,start,end):n = len(graph)distances = [float('inf') for i in range(n)]distances[start] = 0queue = collections.deque( [(0,start)])vis = [False] * nwhile queue:current_distance,current_node = queue.popleft();if vis[current_node]:continuevis[current_node] = Truefor neighbor,weight in graph[current_node]:new_distance = current_distance + weightif new_distance < distances[neighbor]:distances[neighbor] = new_distancequeue.append((new_distance,neighbor))return distances[end]print(dijkstra(graph,A-1,B-1))


http://www.ppmy.cn/news/1158940.html

相关文章

操作系统四大特征

OS四大特征 1.OS的并发性&#xff08;同一时间间隔内执行和调度多个程序的能力&#xff09; 宏观上&#xff0c;处理机同时执行多道程序 微观上&#xff0c;处理机在多道程序间高速切换(分时交替执行)&#xff0c;微观上并非是同时执行的。 关注单个处理机同一时间段内处理任…

正点原子嵌入式linux驱动开发——新字符设备驱动实验

经过之前两篇笔记的实战操作&#xff0c;已经掌握了Linux字符设备驱动开发的基本步骤&#xff0c;字符设备驱动开发重点是使用register_chrdev函数注册字符设备&#xff0c;当不再使用设备的时候就使用unregister_chrdev函数注销字符设备&#xff0c;驱动模块加载成功以后还需要…

如何让你的桌面干净得像一张白纸(详细教程)

文章目录 固定到任务栏固定到快速访问固定到“开始”屏幕添加桌面右键菜单最终效果展示程序员专属工具箱 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xff1a;全栈弄潮儿的…

el-table的formatter属性的使用方法

一、formatter是什么&#xff1f; formatter是el-table-column的一个属性&#xff0c;用来格式化内容。&#xff08;比如后台给你返0或1&#xff0c;你需要展示成“否”和“是”&#xff09; 二、详细使用 1.知道formatter之前&#xff1a; 代码如下&#xff08;示例&#…

webrtc安全性 加密方式

媒体加密与通信安全 有各种不同的做法会让实时通信软件暴露在安全隐患中。其中需要特别值得注意的是在信息传输的过程中截取未加密的媒体或者数据。这可以发生在浏览器到浏览器之间或者浏览器到服务器之间的通信过程中&#xff0c;第三方可以窃取到所有发送的数据。但是在数据加…

香港空间在http重定向https出现400状态码

在互联网的发展过程中&#xff0c;随着网络安全意识的提高&#xff0c;越来越多的网站开始采用HTTPS协议来保护用户的数据安全。而为了确保所有的HTTP访问都能重定向到HTTPS站点&#xff0c;一些问题也随之而来。 当我们访问一个使用HTTP协议的网站时&#xff0c;很多浏览器默认…

卡券促销活动如何裂变用户?如何设计吸引人的卡券机制?

​卡券促销活动是市场营销中常见的一种策略&#xff0c;它能够有效地促进产品销售。为了满足不同类型的营销需求&#xff0c;需要根据具体情况配置不同的卡券活动落地手段&#xff0c;以更好地抓住消费者的心理&#xff0c;达到增加收入的目的。 在用户拉新方面&#xff0c;可以…

C语言-程序环境和预处理(2)--带副作用的宏参数,宏与函数的对比,#undef,条件编译,文件包含

前言 上一篇文章–《C语言-程序环境和预处理&#xff08;1&#xff09;》讲述了程序的翻译环境和执行环境&#xff0c;编译、连接&#xff0c;预定义符号&#xff0c;#define&#xff0c;#符号和##符号的相关知识。 链接: 《C语言-程序环境和预处理&#xff08;1&#xff09;》…