shortest path 实现
使用python内置函数直接实现Dij算法,每次用全部已包含集中的点进行计算:
def Dij(start):list_a = [1,2,3,4,5,6,7,8,9,10] ##所有点的集合list_s = [start] ##最短路径已经确定的点的集合sdist = {} ##最后的结果,存为一个dictionary,key是点的数字,value是从start出发最短的距离dist[start] = 0 while True:if len(list_s) == 10: return disttemp = {} ##临时字典,记录所有从s出发右边可以用一条边连接的点for i in list_s:for j in list(set(list_a)-set(list_s)):if map[i][j] >= 0:temp[(dist[i]+map[i][j])] = [i,j] ##记录点的临时最短距离,为s中的点的最短距离加上该边的距离dist[temp[min(temp)][1]] = min(temp) ##挑选其中临时最短距离最小的一个点加入s,其临时最短距离就是其真实的最短距离patch[temp[min(temp)][1]] = temp[min(temp)][0] ##记录最短路径具体经过的点list_s.append(temp[min(temp)][1]) ##挑选其中临时最短距离最小的一个点加入sif __name__ == '__main__':map=[[],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],]map[1][2] = 40map[1][3] = 8map[1][4] = 10map[2][7] = 10map[2][5] = 6map[3][2] = 4map[3][4] = 12map[3][6] = 2map[4][6] = 1map[5][3] = 2map[5][6] = 2map[5][7] = 4map[6][8] = 4map[6][9] = 3map[7][8] = 20map[7][10] = 1map[8][5] = 0map[8][10] = 20map[9][4] = 6map[9][8] = 10map[9][10] = 2patch={}Dij(1)
使用data_structure课中的,每次用结点进行搜索,并不断更新dist的步骤:
Python实现代码:
def Dij(start):list_a = [1,2,3,4,5,6,7,8,9,10]list_s = [start] dist = [[],100,100,100,100,100,100,100,100,100,100]dist[start] = 0 ##初始化最短距离,起点设为0,和起点有边连接的设为该边数值,其余点设为无穷大(此处为100)for j1 in list_a: if map[start][j1] >= 0:dist[j1] = map[start][j1]while True:if len(list_s) == 10: ##终止条件return disttemp ={}for j2 in list(set(list_a)-set(list_s)): ##未收录在s集合中的点中dist最小的点Vtemp[dist[j2]] = j2V = temp[min(temp)]list_s.append(V) ##将V加入s中for j3 in list(set(list_a)-set(list_s)): ##更新所有未收录在s集中的点的distif map[V][j3] >= 0:if dist[V] + map[V][j3] < dist[j3]:dist[j3] = dist[V] + map[V][j3]path[j3] = V
现在考虑解决任意起点终点的最短路径问题,用floyd算法:
每次迭代计算只经过编号小于k的定点的路径
其Python的代码实现为:
def floyd():## 初始化时没有边直接相连的点之间最短距离需要设置成无穷大,此处为100P = mapD = mapfor i1 in range(1,11):for j1 in range(1,11):if i1 == j1:D[i1][j1] = 0if map[i1][j1] == -1 :D[i1][j1] = 100for k in range(1,11):for i2 in range(1,11):for j2 in range(1,11):if D[i2][k]+D[k][j2] < D[i2][j2]:D[i2][j2] = D[i2][k]+D[k][j2]return Dif __name__ == '__main__':map=[[],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[[],-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],]map[1][2] = 40map[1][3] = 8map[1][4] = 10map[2][7] = 10map[2][5] = 6map[3][2] = 4map[3][4] = 12map[3][6] = 2map[4][6] = 1map[5][3] = 2map[5][6] = 2map[5][7] = 4map[6][8] = 4map[6][9] = 3map[7][8] = 20map[7][10] = 1map[8][5] = 0map[8][10] = 20map[9][4] = 6map[9][8] = 10map[9][10] = 2result = floyd()
shortest path 实现相关推荐
- P - The Shortest Path in Nya Graph HDU - 4725
P - The Shortest Path in Nya Graph HDU - 4725 最短路 不是 每两个点之间按层数设置边权 + 额外边权 TLE 是 相邻两层之间设置边权 + 额外边权 需注 ...
- [CF843D]Dynamic Shortest Path
[CF843D]Dynamic Shortest Path 题目大意: 给定一个带权有向图,包含\(n(n\le10^5)\)个点和\(m(m\le10^5)\)条边.共\(q(q\le2000)\) ...
- zoj 2760 How Many Shortest Path 最大流
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1760 Given a weighted directed graph ...
- OSPF(Open Shortest Path First开放式最短路径优先)
**协议** OSPF(Open Shortest Path First开放式最短路径优先)是一个内部网关协议(Interior Gateway Protocol,简称IGP),用于在单一自治系统(a ...
- 4kyu Path Finder #2: shortest path
4kyu Path Finder #2: shortest path 题目背景: Task You are at position [0, 0] in maze NxN and you can onl ...
- AOJ GRL_1_C: All Pairs Shortest Path (Floyd-Warshall算法求任意两点间的最短路径)(Bellman-Ford算法判断负圈)
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_1_C All Pairs Shortest Path Input ...
- AOJ GRL_1_B: Shortest Path - Single Source Shortest Path (Negative Edges) (Bellman-Frod算法求负圈和单源最短路径)
题目链接: http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_1_B Single Source Shortest Path ( ...
- AOJ GRL_1_A: Single Source Shortest Path (Dijktra算法求单源最短路径,邻接表)
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_1_A Single Source Shortest Path In ...
- zoj How Many Shortest Path
How Many Shortest Path 题目: 给出一张图,求解最短路有几条.处理特别BT.还有就是要特别处理map[i][i] = 0,数据有不等于0的情况! 竟然脑残到了些错floyd! ! ...
- CF938G Shortest Path Queries(线性基/线段树分治/异或)
CF938G Shortest Path Queries 支持加边删边和查询两点之间的异或最短路,我们可以使用线段树分治,然后利用线性基求解. 但是这里图可能不是联通的,所以查询两点之间的异或和需要边 ...
最新文章
- Python(迭代、三元表达式、列表生成、生成器、迭代器)
- 网站推广专员浅析不做大幅修改如何调整网站推广内容?
- hashset去重原理_基于simhash的文本去重原理
- 批梯度下降 随机梯度下降_梯度下降及其变体快速指南
- 19-6/28作业:100以内偶数求和
- python中导入模块队列_【每日学习】Python中模块的导入
- 程序员山洞开发程序,两年敲45万行代码,网友:一般人扛不住
- Python实现完全二叉树
- PHPCMS v9里面,推荐位ID【posid】的值是如何确定的?是自定义的还是官方定义好的?...
- servlet的url-pattern匹配规则详细描述
- jeep智能手表软件测评中心的测试,够了,不要太帅:Jeep黑骑士智能手表深度评测...
- 锐捷交换机配置snmp版本_原创整理:锐捷S3550系列交换机基本配置命令(一)
- unity相机自由移动
- 打印机扫描无法连接到计算机名,网络打印机无法扫描到电脑怎么处理
- 《卡拉马佐夫兄弟》:父子五人性格概述
- iOS开发之千呼万唤始出来iOS10更新内容以及iOS 10的闪退问题解决
- 关于课题的一点思考(基于多生理信号的情绪识别)
- java绘制菱形平行四边形_Java实现金字塔形菱形平行四边形
- 基于PyTorch的生成对抗网络入门(3)——利用PyTorch搭建生成对抗网络(GAN)生成彩色图像超详解
- 大学生创新工作室阶段性总结
热门文章
- 记住要仰望星空,不要低头看脚下!
- VS2017 DLL 不能正常注册 HRESULT -2147024703 排查
- 自己动手做网络爬虫系列——1
- Canvas三种动态画圆实现方法说明
- pxe装机dhcp获取不到_Windows – PXE启动无法通过DHCP获取IP地址,但DHCP在操作系统启动时有效...
- Python年利率计算器【N日年化收益率】
- Android打开相册并上传图片至服务器
- oralce的时间戳数据同步到hive报脏数据错误
- 计算机网络与图论,图论与复杂网络.pdf
- 视频生成动画数据OpenPose+OpenCV