Algorithm 基于BFS的图最小生成树
这是我正在努力解决的一个练习考试的问题: 设G=(V,E)是一个加权无向连通图,具有正 权重(您可以假设权重是不同的)。给一个真正的 数字r,定义子图Gr=(V,{e在e|w(e)O(m)中) 而true do=>O(m) Gr=G,边e | w(e)>r移除=>O(m) 如果| BFS(Gr).V |<| V |=>O(m+n) r++(或r=次最小的w(e)) 其他的 返回rAlgorithm 基于BFS的图最小生成树,algorithm,graph-theory,breadth-first-search,minimum-spanning-tree,Algorithm,Graph Theory,Breadth First Search,Minimum Spanning Tree,这是我正在努力解决的一个练习考试的问题: 设G=(V,E)是一个加权无向连通图,具有正 权重(您可以假设权重是不同的)。给一个真正的 数字r,定义子图Gr=(V,{e在e|w(e)O(m)中) 而true do=>O(m) Gr=G,边e | w(e)>r移除=>O(m) 如果| BFS(Gr).V |O(m+n) r++(或r=次最小的w(e)) 其他的 返回r 这是一个巨大的O(m^2+mn)。有没有办法把它归结为O(mlogn)?谢谢!下面的算法呢 首先从图中获取所有边(或所有不同的边长
这是一个巨大的O(m^2+mn)。有没有办法把它归结为O(mlogn)?谢谢!下面的算法呢 首先从图中获取所有边(或所有不同的边长度,使用)的列表并对它们进行排序。这需要O(m*logm)=O(m*logn)时间:m通常小于n^2,因此O(logm)=O(logn^2)=O(2*logn)=O(logn) 很明显,r应该等于某条边的权重,因此可以在排序数组中对边的索引进行二进制搜索
对于您尝试的每个索引,您将对应边的长度作为r,并检查图的连通性,仅使用长度的边,您迭代所有可能的边代价,这将导致O(m)的外循环。请注意,如果在放弃所有边>w(e)时图断开连接,则它也会断开>w(e')其中
w(e')
。可以使用此属性对边缘成本进行二进制搜索,从而在O(log(n))中执行此操作
lo=min(w(e)表示边缘中的e),hi=max(w(e)表示边缘中的e)
低(中)):
lo=中
其他:
hi=mid-1
返回lo
二进制搜索的复杂度为O(log(max_e-min_e))(实际上可以将其降到O(log(edges)),丢弃边和确定连通性可以在O(edges+顶点)中完成,因此这可以在O((edges+顶点)*log(edges))中完成
警告:我还没有在代码中测试这一点,所以可能会有bug。但是这个想法应该会起作用。这会更好,但是O((m+n)logm)仍然>O(mlogn)。还有一个很大的区别,因为logm>logn。几乎就是这样!实际上,O((m+n)logm)=O(m logn)。m+n=O(m),因为n=O(m)。另外,因为m=O(n^2),O(logm)=O(log(n^2))=O(2 logn)=O(logn)。所以O((m+n)logm)=O(m logn)。我认为我们不能假设m
r = min( w(e) ) => O(m)
while true do => O(m)
Gr = G with edges e | w(e) > r removed => O(m)
if | BFS( Gr ).V | < |V| => O(m + n)
r++ (or r = next smallest w(e))
else
return r
lo=min(w(e) for e in edges), hi=max(w(e) for e in edges)
while lo<hi:
mid=(lo+hi)/2
if connected(graph after discarding all e where w(e)>w(mid)):
lo=mid
else:
hi=mid-1
return lo