Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 基于BFS的图最小生成树_Algorithm_Graph Theory_Breadth First Search_Minimum Spanning Tree - Fatal编程技术网

Algorithm 基于BFS的图最小生成树

Algorithm 基于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)?谢谢!下面的算法呢 首先从图中获取所有边(或所有不同的边长

这是我正在努力解决的一个练习考试的问题:

设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)) 其他的 返回r
这是一个巨大的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)。我认为我们不能假设mr = 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