请问能否帮我查找一下 Fleury 算法(用于获取欧拉回路)的时间复杂度?
Fleury算法并不完整,直到你指定如何识别桥边。Tarjan提供了一个线性时间算法来识别所有的桥(参见http://en.wikipedia.org/wiki/Bridge_(graph_theory)),因此,一个天真的实现每次删除一条边后重新运行Tarjan的算法将是O(E^2)。可能有更好的方法重新计算桥集合,但也有一个更好的O(E)算法(请参见http://www.algorithmist.com/index.php/Euler_tour#Fleury.27s_algorithm;这不是我的网站 :))。
Fleury算法包括以下步骤:
确保图形具有0个或2个奇顶点。
如果有0个奇顶点,则可以从任何地方开始。如果有2个奇顶点,则从其中一个开始。
逐个跟随边缘。如果在桥和非桥之间有选择,则始终选择非桥。
当没有边可用时停止。
如果通过Tarjan算法发现了桥,并且这些桥存储在邻接矩阵中,则我们无需每次运行Tarjan算法来检查边是否为桥。我们可以在O(1)时间内检查所有其他桥查询的情况。因此,Flury算法的时间复杂度可以降低到O(V+E){因为这是DFS},但是这种方法需要额外的O(V2)空间来存储桥。