algorithm - 谁能告诉我为什么我的算法是错误的?
问题描述
我正在研究单源最短路径问题,我对 bfs 进行了修改以解决该问题。该算法在 O(2E) 时间内运行,我只是不明白为什么它是错误的(它必须是否则 dijstra 不是最有效的算法)。
def bfs_modified(G,src,des):
intialize d(src)=0, and d(!src) = inf
visited[all_vertex]=False
q=queue(src)
while q is not empty:
u=q.pop()
if(not visited[u]):
visited[u]=True
for all v connected to u:
q.insert(v)
if(d[v]>d[u]+adj[u][v]):
d[v]=d[u]+adj[u][v]
return d[des]
解决方案
在 Dijkstra 的算法中,优先级队列确保您在知道顶点与源的距离之前不会处理它。
BFS 没有这个属性。如果到顶点的最短路径的边数多于边数最少的路径,则处理得太早。
例如,当您想要从S
到的最短路径时,请考虑此图T
:
S--5--C--1--T
| |
1 1
| |
A--1--B
VertexC
将在 vertex 之前被访问B
。你会认为距离C
是 5,因为你还没有发现更短的路径。当C
被访问时,它将为 分配距离 6 T
。这是不正确的,并且永远不会被修复,因为C
不会再次访问。
推荐阅读
- asp.net - Docker 容器中的 ASP.NET Core 优雅关闭
- java - 在 Select getElementDomAttribute 方法上抛出 UnsupportedCommandException
- c++ - 如何在 x64 程序中获取堆栈调用信息?
- c++ - socket关闭后控制流程如何?
- javascript - Quick access to deeply nested values in Objects in Javascript
- c++ - 在地图中增加元组
- android - 在 MediaStore.Audio.Media,DATA 被弃用后,在 Android 11 中获取歌曲的专辑封面
- python - 编写一个循环代码来计算平均 77 次不同的时间,使用另一列作为标准
- asp.net - C# 使用 ID 节点反序列化 Json
- kubernetes - 网络中断期间对 Redhat Openshift 工作负载的影响