- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是一个消费税
Suppose we are given the minimum spanning tree T of a given graph G (with n vertices and m edges) and a new edge e = (u, v) of weight w that we will add to G. Give an efficient algorithm to find the minimum spanning tree of the graph G + e. Your algorithm should run in O(n) time to receive full credit.
我有这样的想法:
在MST中,只需找出u和v之间的路径。然后找到(沿着路径)具有最大权重的边;如果最大权重大于 w,则从 MST 中删除该边并将新边添加到 MST。
棘手的部分是如何在 O(n) 时间内完成此操作,我也被卡住了。
问题是 MST 是如何存储的。在正常的 Prim 算法中,MST 存储为父数组,即每个元素都是相应顶点的父。
那么假设消费税给了我一个指示 MST 的父数组,我如何才能在 O(n) 中发布上述算法?
首先,如何从父数组中识别 u 和 v 之间的路径?我可以为 u 和 v 创建两个祖先数组,然后检查共同的祖先,然后我可以获得路径,尽管是向后的。我想对于这部分,要找到共同的祖先,至少我必须在 O(n^2) 中完成,对吧?
然后,我们就有了路径。但是我们仍然需要找到路径上每条边的权重。由于我假设该图将使用 Prim 算法的邻接表,因此我们必须执行 O(m)(m 是边的数量)来定位边的每个权重。
...
所以我看不出有可能在 O(n) 中执行该算法。我错了吗?
最佳答案
你的想法是对的。请注意,找到 u
和 v
之间的路径是 O(n)
。我假设您有一个 parent array
标识 MST。跟踪从 u
到 v
或 u
到 root vertex
的路径(最大边)应该只需要 O(n)
。如果您到达 root vertex
,只需跟踪从 v
到 u
或 root vertex
的路径。
现在您有了从 u -> u1 ... -> max_path_vert1 -> max_path_vert2 -> ... -> v
的路径,移除边 max_path_vert1->max_path_vert2
(假设这大于添加的边)并反转 u->...->max_path_vert1
的父级并标记 parent[u] = v
。
编辑:为清楚起见提供更多解释
请注意,在 MST 中,任何一对顶点之间都只有一条路径。因此,如果您可以从 u->y
和 v->y
进行追踪,那么您最多只追踪了 n
个顶点。如果您跟踪了超过 n
个顶点,这意味着您访问了一个顶点两次,这在 MST 中不会发生。好的,现在希望您确信从 u->y
和 v->y
跟踪是 O(n)。一旦你有了这些路径,你就建立了一条来自 u->v
的路径。你看怎么样?我假设这是一个无向图,因为为有向图寻找 MST 本身就是一个不同的概念。对于无向图,当您有一条来自x->y
的路径时,您就有一条来自y-x
的路径。所以,u->y->v
存在。您甚至不需要从 y->v
追溯,因为 v->y
的权重将与 y->v< 的权重相同
。当您从 u->y
和 v->y
追踪时,只需找到具有最大权重的边即可。
现在用于在 O(1) 中查找边权重;您如何存储当前的体重?邻接表还是邻接矩阵?对于 O(1) 访问,按照存储父顶点数组的方式存储它。所以,weight[v] = weight(v, parent[v])
。因此,您将拥有 O(1) 访问权限。希望这会有所帮助。
关于algorithm - graph - 添加新边后更新最小生成树的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10404714/
我创建了一个用户可以添加测试的字段。这一切运行顺利我只希望当用户点击(添加另一个测试)然后上一个(添加另一个测试)删除并且这个显示在新字段中。 所有运行良好的唯一问题是点击(添加另一个字段)之前添加另
String[] option = {"Adlawan", "Angeles", "Arreza", "Benenoso", "Bermas", "Brebant
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在努力将 jQuery 滚动功能添加到 nav-tab (Bootstrap 3)。我希望用户能够选择他们想要的选项卡,并在选项卡内容中有一个可以平滑滚动到 anchor 的链接。这是我的代码,可
我正在尝试在用户登录后再添加 2 个 ui 选项卡。首先,我尝试做一个之后。 $('#slideshow').tabs('remove', '4'); $("#slideshow ul li:last
我有一个包含选择元素的表单,我想通过选择添加和删除其中一些元素。这是html代码(这里也有jsfiddle http://jsfiddle.net/txhajy2w/):
正在写这个: view.backgroundColor = UIColor.white.withAlphaComponent(0.9) 等同于: view.backgroundColor = UICo
好的,如果其中有任何信息,我想将这些列添加到一起。所以说我有 账户 1 2 3 . 有 4 个帐户空间,但只有 3 个帐户。我如何创建 java 脚本来添加它。 最佳答案 Live Example H
我想知道是否有一种有效的预制算法来确定一组数字的和/差是否可以等于不同的数字。示例: 5、8、10、2,使用 + 或 - 等于 9。5 - 8 = -3 + 10 = 7 + 2 = 9 如果有一个预
我似乎有一个卡住的 git repo。它卡在所有基本的添加、提交命令上,git push 返回所有内容为最新的。 从其他帖子我已经完成了 git gc 和 git fsck/ 我认为基本的调试步骤是
我的 Oracle SQL 查询如下- Q1- select hca.account_number, hca.attribute3, SUM(rcl.extended_amou
我正在阅读 http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingG
我正在尝试添加一个“加载更多”按钮并限制下面的结果,这样投资组合页面中就不会同时加载 1000 个内容,如下所示:http://typesetdesign.com/portfolio/ 我对 PHP
我遇到这个问题,我添加了 8 个文本框,它工作正常,但是当我添加更多文本框(如 16 个文本框)时,它不会添加最后一个文本框。有人遇到过这个问题吗?提前致谢。 Live Link: JAVASCRIP
add/remove clone first row default not delete 添加/删除克隆第一行默认不删除&并获取正确的SrNo(例如:添加3行并在看到问题后删除SrNo.2)
我编码this ,但删除按钮不起作用。我在控制台中没有任何错误.. var counter = 0; var dataList = document.getElementById('materi
我有一个类似数组的对象: [1:数组[10]、2:数组[2]、3:数组[2]、4:数组[2]、5:数组[3]、6:数组[1]] 我正在尝试删除前两个元素,执行一些操作,然后将它们再次插入到同一位置。
使用的 Delphi 版本:2007 你好, 我有一个 Tecord 数组 TInfo = Record Name : String; Price : Integer; end; var Info
我使用了基本的 gridster 代码,然后我声明了通过按钮添加和删除小部件的函数它工作正常但是当我将调整大小功能添加到上面的代码中时,它都不起作用(我的意思是调整大小,添加和删除小部件) 我的js代
title 323 323 323 title 323 323 323 title 323 323 323 JS $(document).keydown(function(e){
我是一名优秀的程序员,十分优秀!