- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
更新:我真的搞砸了原来的问题。我原来的标题是“为什么我们首先对非循环加权有向图最短路径问题进行拓扑排序?”但我的问题内容是关于 Dijkstra 算法的。希望自从我更改了标题后,问题的更新方式对其他人有用。更新后的问题标题的答案是“是”。
原始问题:
为什么要先做拓扑排序? (see code here)我不能只使用下面显示的 Dijkstra 算法并完全避免拓扑排序吗(语法上有点乱,但你明白了)
MinIndexedPriorityQueue waitingEdges = new MinIndexedPriorityQueue
Graph g //some weighted directed graph
double[] distTo = new double[g.vertexCount]
Edge[] edgeTo = new Edge[g.vertexCount]
int source = //init to some value
void minPathInit()
init distTo to double.MAX_VALUE
//init first node
distTo [source] = 0
visit(source)
while waitingEdges.count>0
int vertex = waitingEdges.dequeue()
relax(vertex )
void relax(v) //note that visit has been renamed to relax
for each edge in graph.getEdgesFrom(v)
int to= edge.to
if edge.weight + distTo [edge.from]< distTo [to]
distTo[to] = edge.weight + distTo [edge.from]
edgeTo[to] = edge
if waitingEdges.contains(to)
waitingEdges.change(to, distTo[to] )
else
waitingEdges.enqueue(to, distTo[to] )
//after everything is initialized
getPathTo(v)
if not hasBeenVisited[v]
return null
Stack path = new Stack
while edgeTo[v] != source
path.push(edgeTo[v])
v = edgeTo[v].from
return path
我能理解为什么 Dijkstra 的算法不能处理负循环(因为它会陷入无限循环)但是如果没有负循环,为什么它会如图所示失败(并且首先需要拓扑排序)
更新: 好吧,我知道我搞砸了这个问题,所以我会尝试通过更新来修复它。感谢您花时间为我指出漏洞。我误以为AcyclicSP去掉拓扑排序就变成了 Dijkstra 算法,而事实并非如此。
但是,我对 Dijkstra 算法(使用上面显示的版本)的问题仍然存在。为什么即使有负权重只要没有循环也不能用呢?有Dijkstra's algorithm here的Java版本.我的与此非常相似(因为这个人的书是我了解它的地方)但他的示例对于你们中的一些人来说可能更容易阅读。
最佳答案
您在原始算法中没有进行任何拓扑排序。但是在非循环图的情况下,您可以将运行时间规定为 O(V)(而原始运行时间为 O(|V|*log(|V|))。原因是您在 O(|V|) 时间内排序,然后您可以使用该顺序,并且不需要任何堆(或优先级队列)。所以总时间减少到 O(|V|)。
关于algorithm - 如果没有循环,如果权重为负,是否可以使用 Dijkstra 算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7552876/
我有一个 if 语句,如下所示 if (not(fullpath.lower().endswith(".pdf")) or not (fullpath.lower().endswith(tup
然而,在 PHP 中,可以: only appears if $foo is true. only appears if $foo is false. 在 Javascript 中,能否在一个脚
XML有很多好处。它既是机器可读的,也是人类可读的,它具有标准化的格式,并且用途广泛。 它也有一些缺点。它是冗长的,不是传输大量数据的非常有效的方法。 XML最有用的方面之一是模式语言。使用模式,您可
由于长期使用 SQL2000,我并没有真正深入了解公用表表达式。 我给出的答案here (#4025380)和 here (#4018793)违背了潮流,因为他们没有使用 CTE。 我很欣赏它们对于递
我有一个应用程序: void deleteObj(id){ MyObj obj = getObjById(id); if (obj == null) { throw n
我的代码如下。可能我以类似的方式多次使用它,即简单地说,我正在以这种方式管理 session 和事务: List users= null; try{ sess
在开发J2EE Web应用程序时,我通常会按以下方式组织我的包结构 com.jameselsey.. 控制器-控制器/操作转到此处 服务-事务服务类,由控制器调用 域-应用程序使用的我的域类/对象 D
这更多是出于好奇而不是任何重要问题,但我只是想知道 memmove 中的以下片段文档: Copying takes place as if an intermediate buffer were us
路径压缩涉及将根指定为路径上每个节点的新父节点——这可能会降低根的等级,并可能降低路径上所有节点的等级。有办法解决这个问题吗?有必要处理这个吗?或者,也许可以将等级视为树高的上限而不是确切的高度? 谢
我有两个类,A 和 B。A 是 B 的父类,我有一个函数接收指向 A 类型类的指针,检查它是否也是 B 类型,如果是将调用另一个函数,该函数接受一个指向类型 B 的类的指针。当函数调用另一个函数时,我
有没有办法让 valgrind 使用多个处理器? 我正在使用 valgrind 的 callgrind 进行一些瓶颈分析,并注意到我的应用程序中的资源使用行为与在 valgrind/callgrind
假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。 现在,一个简单且不常见的方法是: 第一种可能性 find a = ReaderT (looku
我的代码似乎有问题。我需要说的是: if ( $('html').attr('lang').val() == 'fr-FR' ) { // do this } else { // do
根据this文章(2018 年 4 月)AKS 在可用性集中运行时能够跨故障域智能放置 Pod,但尚不考虑更新域。很快就会使用更新域将 Pod 放入 AKS 中吗? 最佳答案 当您设置集群时,它已经自
course | section | type comart2 : bsit201 : lec comart2 :
我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp。 我应该将 OkHttp 添加到我的 build.gradle 中,还是让我的 SDK 用户包含它?在这种情况下,
随着 Rust 越来越充实,我对它的兴趣开始激起。我喜欢它支持代数数据类型,尤其是那些匹配的事实,但是对其他功能习语有什么想法吗? 例如标准库中是否有标准过滤器/映射/归约函数的集合,更重要的是,您能
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我一直在研究 PHP 中的对象。我见过的所有示例甚至在它们自己的对象上都使用了对象构造函数。 PHP 会强制您这样做吗?如果是,为什么? 例如: firstname = $firstname;
...比关联数组? 关联数组会占用更多内存吗? $arr = array(1, 1, 1); $arr[10] = 1; $arr[] = 1; // <- index is 11; does the
我是一名优秀的程序员,十分优秀!