你認爲當邊緣很危險的時候你的狀況是正確的,我想。但沒有必要真正找到一個週期並測試它的每個邊緣。
克魯斯卡爾算法增加了邊緣的增加重量順序,所以邊緣添加的序列可以分解成等重邊添加塊。在每個等重塊內,如果有多於一條邊連接相同的兩個分量,那麼所有這些邊都是非關鍵的,因爲可以選擇任何一個其他邊。 (我說他們是全部非關鍵因爲我們實際上沒有給出特定的MST作爲輸入的一部分 - 如果我們這樣做,那麼這將確定一個特殊的邊界來稱爲非關鍵邊緣.Kruskal實際選擇的邊緣是隻是初始邊緣排序的一種假象或者排序是如何實現的)。
但是這還不夠:它可能是在向MST添加權重4或更小的所有邊之後,我們發現有3個權重 - 5個邊,連接組件對(1,2),(2,3)和(1,3)。雖然沒有任何組件對通過這3個邊中的1個以上連接,但我們只需要(任何)2個 - 使用全部3個會創建一個循環。
對於每個有權重w的等權塊,我們實際需要做的是(概念上)創建一個新圖,其中MST的每個分量到目前爲止(即使用重量爲< w的邊)是頂點,並且每當在這些組件之間存在權重w邊緣時,在2個頂點之間存在邊緣。 (這可能會導致多邊形。)然後,我們在此圖形的每個組件上運行DFS以查找任何週期,並將屬於此週期的每條邊標記爲非關鍵。 DFS需要O(nEdges)時間,因此每個塊(其大小總和爲E)的DFS時間總和將爲O(E)。
請注意,克魯斯卡爾算法需要花費時間O(Elog E),而不是O(E),雖然像Bernard Chazelle這樣的人已經接近線性時間MST構造,但TTBOMK還沒有人! :)
我沒有得到爲什麼總和dfs時間將是O(E)。 考慮此圖http://i.imgbox.com/RdXix9x4.png dfs是否會分別通過Kruskal算法的第3步遍歷3,5,7,9,11個頂點?它導致稀疏圖的附加時間至少爲O(V^2)(我不確定如何爲O(EV)情況生成E << V^2圖,但我認爲這是可能的)。在密集圖上,dfs將被稱爲O(E - (V-1))〜O(V^2)次,其代價爲O(V),因此總附加複雜度爲O(V^3)根本不是O(ElogE)。 Mb我在哪裏錯了? – Ralor
這裏是密集圖形的壞測試http://i.imgbox.com/hbWvMRmg.png 雖然))目前我正在尋找ElogV解決方案(實際上它被問在Sedgewick書) – Ralor
@Ralor :我的O(E)聲明的DFS時間總和有點不對,因爲您還需要時間來維護「組件圖」(每個頂點是MST組件的圖形,至此,每個邊是原始圖中的權重-w邊),這至少需要每個操作的逆阿克曼時間。 (處理原始圖中的等權重邊的每個塊導致在組件圖中組合一些頂點的子集,並且提取新的邊的子集。)之後,注意原始圖中的每個邊將是由DFS訪問一次。 –