我目前正致力于编写Baruvka算法,如下所示。但是如果已经存在于使用贪婪选择已经采用的边缘列表中,则给出一个检查边e = uv的问题。如何在O(logn)时间内搜索边e?你可以帮忙解决这个问题......搜索操作可以使用BFS或DFS来完成,并检查是否存在边缘,但如果我为每个阶段进行操作,这将成为一项代价高昂的操作。
Boruvka
{
while (T < n-1 edges)
{
Find the components of T
for each tree Ti of the forest T
{
Find the smallest weight edge e = uv such that u is in Ti and v is not in Ti
//Before adding e to T I have to check if it already exists in the list of greedy edges or not. If it exists then I would like to skip adding e to T and go to the next phase.
Add e to T
}
}
return T
}
但是存在多次添加一条边的问题。因此,为了消除这一点,我们需要在添加之前检查是否已将边添加到T中。这项检查是否有O(n)实现?
答案 0 :(得分:0)
您应该为每个组件使用不相交的集数据结构或其他一些数据结构。当边连接两个不同的连接组件时,边缘如何先前存在于树边列表中?请阅读Boruvka's algorithm。
无论何时选择边,都应合并由该边连接的那两个组件。合并时,将此大型组件视为新的顶点,其边缘应为其组成组件的边缘向外。