Re: 有關Kruskal演算法語法的問題

看板C_and_CPP (C/C++)作者 (contemplation)時間18年前 (2006/03/23 13:16), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串1/2 (看更多)
※ 引述《huangwh (香腸)》之銘言: : 你是說 3的媽媽為2 : 2的媽媽為1 : 最後 1 的媽媽就是6 : 也就是(6,1) : 是這樣子嗎? : 方便用我原本的例子 : 來講解一下可以嗎? : 謝謝 : 但是我就是不知道要怎將這斷語法用c++寫出來~!! 不考慮效率什麼的問題的話 最簡單的方法就是: 假設你有七個點好了 那就 maintain 7 個 circular link list 初始值就是大家指著自己 0┐ 1┐ 2┐ 3┐ 4┐ 5┐ 6┐ ↑│ ↑│ ↑│ ↑│ ↑│ ↑│ ↑│ └┘ └┘ └┘ └┘ └┘ └┘ └┘ next operation 有分兩類, 一個是把 (x, y) 歸成同一類 這裡稱之為 Union(x,y) 一個是查 (x, y) 是否為同一類 這裡稱之為 isSameGroup(x,y) 每次先查查他們在不在同一個 group (用 isSameGroup(x,y)) 如果已經在同一個 group 了, 就 ignore, 就是你 * 的那類 否則就用 Union(x,y) 把他們組合起來 (5,0) 把 5 拿出來, 它現在是: 順著它的 next link 往下走 5┐ 直到走回自己都沒有看到 0 ↑│ 所以 isSameGroup(5,0) 就是 false └┘ 我們就要進行 Union(5,0) 的動作 ┌─┐ │ ↓ 0 5 1┐ 2┐ 3┐ 4┐ 6┐ ↑ │ ↑│ ↑│ ↑│ ↑│ ↑│ └─┘ └┘ └┘ └┘ └┘ └┘ (3,2) 把 3 拿出來, 它現在是: 順著它的 next link 往下走 3┐ 直到走回自己都沒有看到 2 ↑│ 所以 isSameGroup(3,2) 就是 false └┘ 我們就要進行 Union(3,2) 的動作 ┌─┐ ┌─┐ │ ↓ │ ↓ 0 5 2 3 1┐ 4┐ 6┐ ↑ │ ↑ │ ↑│ ↑│ ↑│ └─┘ └─┘ └┘ └┘ └┘ (6,1) 把 6 拿出來, 它現在是: 順著它的 next link 往下走 6┐ 直到走回自己都沒有看到 1 ↑│ 所以 isSameGroup(6,1) 就是 false └┘ 我們就要進行 Union(6,1) 的動作 ┌─┐ ┌─┐ ┌─┐ │ ↓ │ ↓ │ ↓ 0 5 2 3 1 6 4┐ ↑ │ ↑ │ ↑ │ ↑│ └─┘ └─┘ └─┘ └┘ (2,1) 把 2 拿出來, 它現在是:  ┌─┐ │ ↓ 順著它的 next link 往下走 2 3 直到走回自己都沒有看到 1 ↑ │ 所以 isSameGroup(2,1) 就是 false └─┘ 我們就要進行 Union(2,1) 的動作 ┌─┐ ┌─┐ ┌─┐ │ ↓ │ ↓ │ ↓ 2 3→1 6 0 5 4┐ ↑ │ ↑ │ ↑│ └─────┘ └─┘ └┘ (6,3)* 把 6 拿出來, 它現在是:  ┌─┐ ┌─┐ │ ↓ │ ↓ 順著它的 next link 往下走 2 3→1 6 直到走回自己前遇到了 3 !! ↑  │ 所以 isSameGroup(2,1) 就是 ture, ignore (6,3) ! └─────┘ 以下略 中間的 link list 處理方法不難, 可以自己想想 :) -- 有時候,遺忘,是令人快樂的。什麼時候?當然是有人傷了你的心的時候。  存心傷你的那個人,固然是故意和你過不去,但是被傷了心而耿耿於懷的你  ,卻是和自己過不去了。所以,記性不好的人,通常會是比較快樂的人,也  是比較不容易被擊倒的人。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.56 ※ 編輯: ledia 來自: 140.112.30.56 (03/23 13:48) ※ 編輯: ledia 來自: 140.112.30.56 (03/23 13:48)

03/23 17:47, , 1F
推薦這篇文章
03/23 17:47, 1F
文章代碼(AID): #148YyU9u (C_and_CPP)
文章代碼(AID): #148YyU9u (C_and_CPP)