Algorithm 图中节点长时间连通性的检测

Algorithm 图中节点长时间连通性的检测,algorithm,graph-algorithm,Algorithm,Graph Algorithm,我从一个没有边的N节点图开始 然后我开始执行M预定步骤 在每一步中,我必须在两个节点之间创建一条边,或者删除一条边 在每一步之后,我必须打印出图形中有多少连接的组件 对于M,是否有一种时间线性算法来解决这个问题?如果不是,在最坏的情况下,是否有一个比O(min(M,N)*M)更好 编辑: 程序无法决定M步骤是什么 我必须从输入中读取,我是应该创建边还是删除边,以及应该创建/删除哪个边 因此,示例输入可能是 N = 4 M = 4 JOIN 1 2 JOIN 2 3 DELETE 2 3 DELE

我从一个没有边的
N
节点图开始

然后我开始执行
M
预定步骤

在每一步中,我必须在两个节点之间创建一条边,或者删除一条边

在每一步之后,我必须打印出图形中有多少连接的组件

对于
M
,是否有一种时间线性算法来解决这个问题?如果不是,在最坏的情况下,是否有一个比
O(min(M,N)*M)
更好

编辑:

程序无法决定
M
步骤是什么

我必须从输入中读取,我是应该创建边还是删除边,以及应该创建/删除哪个边

因此,示例输入可能是

N = 4
M = 4
JOIN 1 2
JOIN 2 3
DELETE 2 3
DELETE 1 2
那么我的输出应该是

3 # (1 2) 3 4
2 # (1 2 3) 4
3 # (1 2) 3 4
4 # 1 2 3 4

有很多方法可以完全在线解决这个问题,但它们比这个答案更复杂。我提出的算法是维护可用边的生成林,以及生成林的组件数量(因此是图)。如果我们完全在线解决这个问题,那么这将是一个问题,因为跨越森林的边缘可能会被删除,让我们通过未使用的边缘进行替换。但是,我们知道当前图形中的每条边将在多长时间内被删除

我们维护的特定生成林是最大权重生成林,其中每个边的权重是其删除时间。如果删除了属于该跨越林的边,则不会进行替换,因为连接由其端点表示的组件的每一条其他边要么尚未插入,要么已经删除了权重较小的边

由于Sleator和Tarjan的原因,有一个动态树数据结构,也称为链接/切割树,可以在对数时间内提供以下操作

Link(u, v, w) - inserts an edge between u and v with weight w;
                u and v must not be connected already

Cut(u, v) - cuts the edge between u and v, if it exists;
            returns a boolean indicating whether an edge was removed

FindMin(u, v) - finds the minimum-weight edge on the path from u to v
                  and returns its endpoints and weight;
                returns null if either u = v or u and v are not connected
要保持林,插入从u到v的边时,将其删除时间与从u到v的路径上的最小值进行比较。如果最小值不存在,则插入边。如果最小值小于新边,请删除最小值并将其替换为新边。否则,什么也不做。删除从u到v的边时,尝试将其从林中删除


该方法的运行时间为O(m logn)。如果你手头没有一个动态树,那么它的实现无疑需要相当长的时间。我没有使用正确的动态树,而是成功地使用了一个简单得多的数据结构,它只将林存储为一组具有权重和父指针的节点。然后运行时间是O(md),其中d是图形的最大直径,如果幸运的话,d比n小很多。

我不确定我是否理解正确,但是你能用前n-1条边连接图形,然后用其余的边填充缺失的边吗?如果到那时你还没有用完所有的m步,请重复一下(删除1个边,添加1个边)直到用完所有的M步?@G.Bach在问题中,您无法选择
M
步是什么。它们是由一些输入预先确定的。您是否可以提前访问整个查询序列?@davidesenstat您可以在打印任何内容之前查看整个输入。