考虑一个有向图在该图上可以动态添加边并进行一些特定的查询。
示例:不相交的森林
考虑以下查询集:
arrow(u, v)
equiv(u, v)
find(u)
第一个向图形添加箭头,第二个确定,最后一个找到等价类的规范表示,即使得表示。ü ↔ * v ↔ * - [R (Û )Ü ↔ * v [R (v )= - [R (Û )
有一种众所周知的算法,它使用不相交集森林数据结构以准恒定的摊销复杂度实现这些查询,即。请注意,在这种情况下,equiv
是使用实现的find
。
更复杂的变体
现在,我对一个方向很重要的更复杂的问题感兴趣:
arrow(u, v)
confl(u, v)
find(u)
第一个添加箭头,秒确定是否存在从和均可到达的节点,即。最后一个应该返回对象,使得暗示其中应该易于计算。(例如,为了进行计算)。目的是找到一个好的数据结构,使这些操作快速进行。confl
周期数
该图可以包含周期。
我不知道是否有一种方法可以有效地和增量地计算强连接的组件,以便仅针对主要问题考虑DAG。
当然,我也希望为DAG提供解决方案。这将对应于最小公共祖先的增量计算。
天真的方法
不相交的森林数据结构在这里没有帮助,因为它忽略了边的方向。请注意,在图形不汇合的情况下,不能是单个节点。
可以定义并在时将定义为。但是如何逐步计算呢?
像通常的联合查找算法一样,计算这么大的集合可能没有用,而较小的集合应该更有趣。