首页 > 编程语言 >代码随想录算法训练营第62天 | 最短路径:dijkstra(堆优化版)+ Bellman_ford算法

代码随想录算法训练营第62天 | 最短路径:dijkstra(堆优化版)+ Bellman_ford算法

时间:2024-08-07 10:49:32浏览次数:17  
标签:62 随想录 算法 edges start dijkstra mindist 城市

47.参加科学大会
https://kamacoder.com/problempage.php?pid=1047
dijkstra(堆优化版)精讲
https://www.programmercarl.com/kamacoder/0047.参会dijkstra堆.html#思路
94.城市间货物运输 I
https://kamacoder.com/problempage.php?pid=1152
Bellman_ford 算法精讲
https://www.programmercarl.com/kamacoder/0094.城市间货物运输I.html#思路

dijkstra(堆优化版)精讲

  • 优化部分:

    • 用邻接列表:不需要一个一个遍历;
    • 用优先堆:不需要找最小值;每次pop出来的就是最小值;
    • 只需要更新mindist
    点击查看代码
    import heapq
    def dijkstra(n, m, grid, start, end):
    	mindist = [float("inf")]*(n+1)
    	visited = [False]*(n+1)
    	mindist[start] = 0
    	pq = [(0,start)]
    	##堆优化
    	while pq:
    		curr_val,u = heapq.heappop(pq)
    		if visited[u]:
    			continue
    		for v,weight in grid[u]:
    			##更新堆
    			if not visited[v] and curr_val+weight<mindist[v]:
    				mindist[v] = curr_val+weight
    				heapq.heappush(pq,(mindist[v],v))
    	if mindist[end]==float("inf"):
    		return -1
    	else:
    		return mindist[end]
    def main():
    	n,m = map(int,input().split())
    	grid = [[] for _ in range(n+1)]
    	for i in range(m):
    		s,e,v = map(int,input().split())
    		grid[s].append((e,v))
    	res = dijkstra(n,m,grid,1,n)
    	print(res)
    
    if __name__ == '__main__':
    	main()
    

94. 城市间货物运输 I

某国为促进城市间经济交流,决定对货物运输提供补贴。共有 n 个编号为 1 到 n 的城市,通过道路网络连接,网络中的道路仅允许从某个城市单向通行到另一个城市,不能反向通行。
网络中的道路都有各自的运输成本和政府补贴,道路的权值计算方式为:运输成本 - 政府补贴。权值为正表示扣除了政府补贴后运输货物仍需支付的费用;权值为负则表示政府的补贴超过了支出的运输成本,实际表现为运输过程中还能赚取一定的收益。
请找出从城市 1 到城市 n 的所有可能路径中,综合政府补贴后的最低运输成本。如果最低运输成本是一个负数,它表示在遵循最优路径的情况下,运输过程中反而能够实现盈利。
城市 1 到城市 n 之间可能会出现没有路径的情况,同时保证道路网络中不存在任何负权回路。

Bellman_ford 算法精讲

  • 核心思想:对所有边进行松弛n-1次操作(n为节点数量),从而求得目标最短路。

  • 松弛:当前节点最小值更新:每个入度:

    • if minDist[B]>minDist[A]+value:
      minDist[B] = minDist[A]+value
  • 需要松弛几次才能得到起点到终点的最短距离

    • 我们对所有边松弛 n-1 次 就一定能得到 起点到达 终点的最短距离。
  • 停止:如果本次没有更新;就停止更新

    点击查看代码
    def bellman(n,m,edges,start,end):
    	mindist = [float("inf")]*(n+1)
    	mindist[start] = 0
    	###松弛n-1次
    	for _ in range(n):
    		update = False
    		##松弛每个边上的节点
    		for s,t,v in edges:
    			if mindist[s]!=float("inf") and mindist[t]>mindist[s]+v:
    				mindist[t] = mindist[s]+v
    				update = True
    		if not update:
    			break
    	if mindist[end]==float("inf"):
    		return "unconnected"
    	else:
    		return mindist[end]
    
    def main():
    	n,m = map(int,input().split())
    	edges = []
    	for i in range(m):
    		s,t,v = map(int,input().split())
    		edges.append((s,t,v))
    	res = bellman(n,m,edges,1,n)
    	print(res)
    
    if __name__ == '__main__':
    	main()
    

标签:62,随想录,算法,edges,start,dijkstra,mindist,城市
From: https://www.cnblogs.com/P201821440041/p/18346222

相关文章

  • 排序算法
    排序算法BUBSort冒泡排序伪代码do-swapped=false-fromi=1to最后一个没有排序过元素的索引-1-ifleft>right--swap(left,right)--swapped=truewhileswapped代码实现voidBubSort(){inttem=0;boolswapped;do{t......
  • 代码随想录算法训练营第61天 | 图论part08:拓扑排序+迪杰斯特拉朴素法
    117.软件构建https://kamacoder.com/problempage.php?pid=1191拓扑排序精讲https://www.programmercarl.com/kamacoder/0117.软件构建.html#拓扑排序的背景47.参加科学大会https://kamacoder.com/problempage.php?pid=1047dijkstra(朴素版)精讲https://www.programmercarl.c......
  • 【数值计算方法】线性方程组迭代算法的Python实现
    线性方程组迭代算法的Python实现jacobi迭代法defJacobiIter(A:np.ndarray,b:np.ndarray,tol:float=1e-5,maxIter:int=100)->Tuple[np.ndarray,np.ndarray]:"""使用Jacobi迭代法求解线性方程组Ax=binput:......
  • 排序算法优化思考
    引言排序算法是人们研究的最多的一类计算机算法,也是计算机中最基础、使用频率最高的一类算法。虽然对排序算法的理论研究在目前看来被认为已经是最优解,但面对工业界各类问题,人们还是持续提出了针对特定场景的“更优”的算法。通过对排序算法的研究和优化,我们可以清晰的感受......
  • python 实现FFT快速傅立叶变换算法
    FFT快速傅里叶变换介绍FFT(快速傅里叶变换)是计算离散傅里叶变换(DFT)及其逆变换的一种高效算法。DFT是一种将信号从时域转换到频域的数学工具,而FFT通过减少计算量来加速这一过程。FFT的基本思想FFT利用了DFT中的对称性和周期性,通过分而治之的策略将DFT分解为更小的DFT,从而显......
  • 排序算法 归并排序 MergeSort -- C语言实现
    归并排序归并排序(Mergesort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(DivideandConquer)的一个非常典型的应用。作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第2种方法);自下......
  • 代码随想录 day 47 回文子串 | 最长回文子序列
    回文子串回文子串解题思路dp数组的状态是判断以i结尾,j开始的字符串是否为回文,用bool类型存储,之后当i和j的字符串相等时,通过计算它们之间的距离和判断它们之间是否为回文串来进行递归。知识点回文,动态规划心得如果不看题解根本想不到怎么做最长回文子序列最长回文子序列......
  • 排序算法 希尔排序 ShellSort -- C语言实现
    希尔排序希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出改进方法的:插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;但插入排序一般来说是低效的,因为插入排......
  • 代码随想录算法训练营第七天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和,总结
    力扣题部分:454.四数相加II题目链接:.-力扣(LeetCode) ​​​​​思路(map哈希表):    将数组分为两组分别用双重for循环遍历。第一组将来自不同数组的两个数之和(记为sum1)作为map的key,两个数之和出现的次数作为map的value,第二组通过在map查询来自不同数组的两......
  • 排序算法 快速排序 quickSort -- C语言实现
    快速排序快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n个项目要Ο(nlogn)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(nlogn)算法更快,因为它的内部循环(innerloop)可以在大部分的架构上很有效率地被实......