Re: [問題] 判斷MST(最小擴張樹)是否有cycle

看板C_and_CPP作者 (--???--)時間14年前 (2009/12/30 10:47), 編輯推噓5(500)
留言5則, 3人參與, 最新討論串4/5 (看更多)
原文恕刪 ※ 引述《l314520 (一生一世我愛你)》之銘言: : A B : C D : 假設AC是10,BD是15,AB是20,CD是25 拿這個當例子試試看好了 (1)宣告一個陣列,記錄每個點是不是有被連起來 初始值都設為0,代表末連上 (2) Kruskal's Algorithm: 2.1 選AC這個邊,A和C都標上1 2.2 選BD這個邊,B和D都標上2 2.3 選AB這個邊;雖然A和B的值都不是0,但數字不一樣,所以AB這個邊還是要選。 順便把B和D的值改成1 2.4 由於全部的點都被連起來了,MST建立完成 更一般化的形式: (1) 宣告一個陣列 Visited[N] = {0}; 一個數字 set = 1; (2) Kruskal's Algorithm: 2.1 選擇最短的邊 Vi-Vj 2.2 比較 Visited[i] 和 Visited[j] 的值 2.2.1 如果兩個都是零,將兩者都設為一個沒有用過的數字 ( Ex: Visited[i] = Visited[j] = set; set++ ) 2.2.2 如果只有一個是零,將數值為零的那個設為與另一個相等 ( Ex: If Visited[i]==0, Visited[j]!=0 → visited[i]=Visited[j]) 2.2.3 如果兩者皆不為零,且兩者值不相等,則掃瞄一次陣列,將與其中之一相 同的數字都改成另一個數字 ( Ex: Visited[i]=2 ,Visited[j]=3 → 掃瞄一次陣列,將Visited陣列 中的3都改成2 ) 2.2.4 如果兩都皆不為零,且兩者值相等,則不做任何變動。 ( 加入此邊會產成迴圈 ) 2.3重覆2.2的步驟,直到所有的點都被連起來 2.2.1、2.2.2、2.2.3都是代表合規定的邊,只有2.2.4的邊會造成迴圈 Time complexity: O( ElogE + V^2 ) -- ∫work dt = success -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.230.219.143

12/30 10:50, , 1F
O(ElogE + EV)
12/30 10:50, 1F

12/30 14:27, , 3F
好方法!我沒想到呢 感謝您
12/30 14:27, 3F

12/30 15:25, , 4F
歷經一番波折,總算搞定MST了,再次感謝
12/30 15:25, 4F

01/03 19:04, , 5F
朝聖,這個算法超神!
01/03 19:04, 5F
文章代碼(AID): #1BEhygXl (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BEhygXl (C_and_CPP)