algorithm - 运行时间 O(kn + m) 的最短路径树算法
问题描述
有没有一种算法可以在 O(kn + m) 的运行时间内在权重为 0、1、...、k 的有向图中构建最短路径树,其中 n 是顶点数,m 是数边缘?
我认为 Dijkstras 算法可能会满足这一点,但它不依赖于边缘的权重。(我很困惑这怎么可能是这种情况)。
这样的算法会是什么样子?
解决方案
关键是(非循环)图的拓扑排序,它允许轻松计算到每个顶点的距离。该方法具有 O(n + m) 复杂度:
1) Initialize dist[] = {INF, INF, …} and dist[s] = 0 where s is the source vertex.
2) Create a Topological order of all vertices. [complexity: O(n+m)]
3) For every vertex u in topological order: [complexity: O(n+m)]
For every adjacent vertex v:
If (dist[v] > dist[u] + weight(u, v)):
dist[v] = dist[u] + weight(u, v)
步骤 3 还立即提供了通过图的最短路径。
推荐阅读
- firebase - 用于检查角色或公司的 Firestore 规则功能
- python - 更改代码后权限被拒绝
- wordpress - 自定义帖子类型的 Ajax 过滤器
- android - 尝试在 Android Studio 中构建 SMS 应用时出现“访问被拒绝”错误
- ios - iPhone X - UIPageControl 黑条
- git - GIT 分支——我们可以只靠一个主人生存吗?
- c# - 使用 app.config 动态更改 Windows 服务上的 Web 服务 URL
- nativescript - 在 NativeScript 布局中居中和右/左对齐项目
- javascript - D3js单横条三种颜色
- laravel - 雄辩,返回 null