我有一个以单个根节点开始的图表。节点逐个添加到图表中。在节点创建时,它们必须通过单个边链接到根节点或另一个节点。也可以创建和删除边缘(在任意两个节点之间逐个删除)。可以一次删除一个节点。节点和边创建,删除操作可以以任意顺序发生。
好的,所以这是我的问题:当删除边缘时,是否可以在恒定时间内(即使用O(1)算法)确定,如果这样做会将图形分成两个不相交的子图形?如果是,那么根节点的哪一边将属于哪个?
我愿意在合理的限度内维护任何可以促进此信息推导的附加数据结构。
也许在O(1)中不可能这样做,如果是这样的话,任何指向文学的人都会受到赞赏。
编辑:图表是有向图。
编辑2:好的,也许我可以限制从根节点删除边缘。 [编辑3:不,实际上]此外,没有边缘落入根节点。
答案 0 :(得分:7)
为了加快显而易见的O(| V | + | E |)解决方案的速度,你可以保留一个生成树,当图形发生变化时,它很容易更新。
如果生成树中的边缘不被删除,则图形不会断开连接并且不执行任何操作。如果生成树中的边缘被删除,则必须尝试在这两个顶点之间找到新路径(如果找到一个,则使用它来更新生成树,否则图形将断开连接。)
所以,最好的情况是O(1),最坏的情况是O(| V | + | E |),但无论如何都要相当简单。
答案 1 :(得分:1)
这是有向图吗?以下假设是无向的。
您要查找的是给定边缘是否为图表中的Bridge。我相信这可以通过遍历查找包含该边的循环来找到,并且将是O(| V | + | E |)。
O(1)太多了,不能问。
您可能会发现在动态图表中维护双边连接组件可能对您有用。
Eppstein等人就此发表了一篇论文:http://www.ics.uci.edu/~eppstein/pubs/EppGalIta-TR-93-20.pdf
,可以在允许边插入和删除的n个节点的图形中维护2边连通分量。它具有每次更新的O(sqrt(n))时间和每个查询的O(log n)时间。
因此,只要删除,就可以在O(logn)中查询以确定2边连接组件的数量是否已更改。我想它也可以告诉你特定节点所在的组件。
本文更为通用,适用于其他图形问题,不仅适用于2个边缘连接组件。
我建议您寻找桥梁和动态双边连接,以帮助您入门。
希望有所帮助。
答案 2 :(得分:0)
现在,Bridge是一个具有所描述属性的边缘,并且也起源于剪切顶点。切割顶点正好是桥,但是在顶点(节点)版本中。
所以唯一的方法(虽然非常弯曲初始数据结构假设)我可以想到,为了获得O(1)复杂度,如果你首先检查图中的每个节点,如果它是一个切割顶点和然后只需在常数时间检查你要删除的边是否附加到这两个中的一个。
查找图形中的节点是否为“切割顶点”需要O(m + n),其中m =#edges和n =#nodes。
干杯