标签:8.7 33 蓝点 白点 dijkstra dijkstradijkstra 误区 disdis dis
什么是dijkstradijkstra?
dijkstradijkstra的原理/流程?
- dijkstradijkstra本质上的思想是贪心,它只适用于不含负权边的图.
- 我们把点分成两类,一类是已经确定最短路径的点,称为"白点",另一类是未确定最短路径的点,称为"蓝点"
- dijkstradijkstra的流程如下::
- 1.1. 初始化dis[start] = 0,dis[start]=0,其余节点的disdis值为无穷大.
- 2.2. 找一个disdis值最小的蓝点x,x,把节点xx变成白点.
- 3.3. 遍历xx的所有出边(x,y,z),(x,y,z),若dis[y] > dis[x] + z,dis[y]>dis[x]+z,则令dis[y] = dis[x] + zdis[y]=dis[x]+z
- 4.4. 重复2,32,3两步,直到所有点都成为白点..
dijkstradijkstra为什么是正确的
- 当所有边长都是非负数的时候,全局最小值不可能再被其他节点更新.所以在第22步中找出的蓝点xx必然满足:dis[x]:dis[x]已经是起点到xx的最短路径..我们不断选择全局最小值进行标记和拓展,最终可以得到起点到每个节点的最短路径的长度
图解
- (令start = 1start=1)
- 开始时我们把dis[start]dis[start]初始化为00,其余点初始化为infinf
- 第一轮循环找到disdis值最小的点11,将11变成白点,对所有与11相连的蓝点的disdis值进行修改,使得dis[2]=2,dis[3]=4,dis[4]=7dis[2]=2,dis[3]=4,dis[4]=7
- 第二轮循环找到disdis值最小的点22,将22变成白点,对所有与22相连的蓝点的disdis值进行修改,使得dis[3]=3,dis[5]=4dis[3]=3,dis[5]=4
- 第三轮循环找到disdis值最小的点33,将33变成白点,对所有与22相连的蓝点的disdis值进行修改,使得dis[4]=4dis[4]=4
- 接下来两轮循环分别将4,54,5设为白点,算法结束,求出所有点的最短路径
- 时间复杂度O(n^2)O(n2)
为什么dijkstradijkstra不能处理有负权边的情况?
- 我们来看下面这张图
- 22到33的边权为-4−4,显然从11到33的最短路径为-2−2 (1->2->3).(1−>2−>3).但在循环开始时程序会找到当前disdis值最小的点33,并标记它为白点.
- 这时的dis[3]=1,dis[3]=1,然而11并不是起点到33的最短路径.因为33已经被标为白点,所以dis[3]dis[3]不会再被修改了.我们在边权存在负数的情况下得到了错误的答案.
dijkstradijkstra的堆优化?
也就是priority_queue
标签:8.7,33,蓝点,白点,dijkstra,dijkstradijkstra,误区,disdis,dis 来源: https://blog.csdn.net/qq_55284358/article/details/119490755
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。