- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给定一个无向图G = (V, E)。首先询问 MST 的成本是多少。我可以使用 Kruskall 算法轻松找出答案,如下所示:
G = (V, E)
for each edge (u, v) in E sorted by wight
{
if(Find(u) != Find(v))
{
Add (u, v) to the MST
Union(u, v); // put u and v in the same set
}
}
之后,对于初始图中的每条边,询问新 MST 的成本是多少,因为该边应出现在最小生成树中。
如果边已经存在于 MST 中,则答案保持不变。否则,我可以再次运行 Kruskall。伪代码如下:
G = (V, E)
G1 = runKruskall(G)
for each edge (u, v) in E
{
ClearUnionSets()
if (u, v) in G1
{
print costOf(G1)
} else {
Union(u, v)
G2 = runKruskall(G)
print costOf(G2)
}
}
该方法的问题在于总复杂度为:O(E*E)
我的问题是,是否存在如上所述更新 MST 的更好解决方案。
我在想的是,当第一次运行 Kruskall 时,对于每条边 (u, v),如果 u 和 v 在同一个集合中,找到部分 MST 中已经存在的最大加权边使得与 (u, v) 的循环并将该信息存储在矩阵 M 中的 M[u][v] 中。这样做,当边成为强制性时更新 MST 的问题将在 O(1) 中得到解决。
谁能帮我解决这个问题?
最佳答案
对于每条不在 MST 上的边 u-v,包括该边的最小生成树是 u-v 替换 MST 上从 u 到 v 的路径上的最大边的生成树。
可以如下高效地找到要替换的边。首先,将 MST Root 于任意顶点。我们将修改算法以找到 lowest common ancestor (LCA) 的两个顶点,描述 here .除了为每个顶点存储第 2^i 个父节点之外,我们还将存储到第 2^i 个父节点的路径上的最大边。使用这个数组,在计算 LCA 的同时,我们还将计算 LCA 路径上的最大边,这为我们提供了两个顶点之间路径上的最大边。
预处理涉及在 O(E log E) 中找到 MST,在 O(N log N) 中为 LCA 构建父表,需要 O(N log N) 空间。在此之后,为每条边找到修改后的 MST 只需要对 LCA 进行一次评估,这可以在 O(log N) 中执行。因此总复杂度仅为 O(E log E)。
关于algorithm - 克鲁斯卡尔的算法 : Update MST when an edge becomes mandatory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37086946/
设计一个算法,该算法采用加权图 G 并找到非 MST 边缘成本的最小变化会导致G的最小生成树。 到目前为止我的解决方案(需要建议): 要对 MST 进行更改,我们需要更改非 MST 边 s.t 的权重
我是学算法的,见过这样的习题 我可以用指数时间解决这个问题但是。我不知道如何证明这个线性时间 O(E+V) 我将不胜感激。 最佳答案 令G为嵌入最小生成树T的图;令 A 和 B 为从 T 中移除 (u
我们知道原始图和原始MST。现在我们改变图中边的权重。除了 Prim 和 Kruskal,我们还有什么方法可以从旧 MST 生成新 MST? 最佳答案 这是我的做法: 如果改变的边在原来的 MST 中
这是一道复习题,我想感受一下我的答案是否正确。 这是原始问题的要点: 您有一个带权无向图的 MST T,然后在节点(u 和 v)之间的原始图中引入一条新边以创建一个新图 G'。给出一个线性时间算法判断
备注:c'是以17为底的logc MST 表示(最小生成树) 当我们使用线性函数对每条边的代价进行变换时,很容易证明结论是正确的。 但是对数函数不是线性函数,我不明白为什么这个结论是正确的。 补充说明
在 ASP.net MVC 应用程序中,我将日期保存在 SQL 服务器数据库中的 datetime 字段上。它的保存方式如下 2015-04-22 18:43:18.967 。所以现在我需要在客户端将
我有一个对称图并创建了一棵树,该树具有从随机顶点到任何其他顶点的所有最短路径。我可以用这棵树来构建最小生成树(MST)吗?我的算法类似于深度优先算法。 最佳答案 在最坏的情况下,最短路径树无助于找到最
假设我们有一个图 G 和它的生成树 T。我们如何检查此生成树是否是 MST? 我建议对于不在 T 中的每条边 i,所有边 j 都在 T= w_j 最佳答案 你要检查对于每条不在 MST 中的边 (u,
我们知道原始图和原始MST。现在我们改变图中的 k 个边权重。有什么方法可以在 O((n + k) log n) 时间内从旧图生成新的 MST? 最佳答案 从原始 MST 开始。 将所有权重降低的边添
我有一个无约束图 G=(V,E) 和权重函数 w:E->R+。另外,我有 G 的 MST T。 我必须构建一个执行以下操作的算法: 如果我们向 E 添加一个具有权重 w(e') 的新边 e'。建议一种
令 G 为具有不同边权重的无向图。令 T 为 G 中的 MST。令 (u, v) 为 T 中的任意边。证明存在一个割 (S; V-S) 使得 (u; v) 是该割中的最小权重边。 最佳答案 我试一试,
我有一个用邻接表表示的图,他的 MST 由父数组表示。 我的问题是我需要从图中删除一条边并更新父数组。 我已经设法处理以下情况: 边不存在; 边在图中但不在 MST 中(MST 不变); 并且边是来自
谁能想出一种方法来修改 Kruskal 的最小生成树算法,使其必须包含某条边 (u,v)? 最佳答案 我可能会感到困惑,但据我所知,kruskal 可以处理负权重,因此您可以赋予这条边 -infini
我想知道是否有人可以指出线性时间算法来在权重数量较少时找到图的 MST(即边只能有 2 个不同的权重)。 除了 Prim 的、Kruskal 的和 Boruvka 的,我在谷歌上找不到任何东西,在这种
让我们假设一个包含 > 25000 个节点的完整图。每个节点本质上是平面上的一个点。它有 625M 条边。每条边都有长度,应存储为 float 。 我需要一个算法来找到它的 MST(在普通 PC 上)
我正在寻找一种算法(或任何其他方式)来确定给定的加权图是否在 O(ElogV) 中具有唯一的 MST(最小生成树)? 我对权重一无所知(例如 weight(e1) != weight(e2)),如果此
我正在尝试制作一个新闻应用程序,它可以从新闻 API 获取响应并将其存储在 newsFeed 中,然后用户可以将一些新闻标记为收藏夹,然后将这些收藏夹存储到新模型收藏夹中 这是我遇到的错误 错误:[m
将 MST 与 MSI 结合使用与运行 MSI 并通过命令行 (MSIEXEC) 传递修改后的属性有什么区别 最佳答案 安MST可以包含对 MSI 的各种更改——包括新的或不同的文件、注册表项、自定义
如何将此字符串转换为 MST 时区 datetime 对象? >>> type(date_str) >>> date_str '2017-01-17T20:02:45.767Z' 最佳答案 这是一个
我在 C 语言中工作,使用 igraph 库。我需要获取 igraph_graph_t 类型 (g) 中给定图形存储的最小生成树。我还有一个包含每条边 (w) 权重的 igraph_vector。以下
我是一名优秀的程序员,十分优秀!