1. 程式人生 > >關於最小生成樹(並查集)prime和kruskal

關於最小生成樹(並查集)prime和kruskal

第一次 clas 不同 可能 檢索 spa 一次 結構 class

適合對並查集有一定理解的人. 新手可能看不懂吧....

並查集簡單點說就是將相關的2個數字聯系起來

比如

房子 1 2 3 4 5 6

能通向的房子 2 3 4 5 6 1

主要 建立並查集的 函數結構 模板(一般不變除非加權--最好能理解)


for(int i=0;i<n;i++)
flag[i]=i; //標記數組初始化以方便尋根

 1 int find(int x)        X相當於1
 2 {
 3     int
r=x,t; r代表的是根節點 4 while(x!=flag[x]) 如果 沒有找到 就繼續追到根為止 5 x=flag[x]; 6 while(r!=x) 7 { //這裏是相關優化 有個定義叫做秩就是類似於樓的層數 秩越低 你就越容易從樓頂走到樓底 將秩全部變成1即一層樓 8 t=flag[r]; 9 flag[r]=x; 10 r=t; 11 } 12 return x; 13 }

主要就是這個

最小生成樹中 keruskai()

核心思想: 將所有元素按照某一標誌 排序 然後從最前開始一次檢索尋根如果

二者沒有相同的根就說明他們是第一次相互關聯 然後把它們的權加到sum上

舉例 : 你要把3個房間打通來讓 別人 可以去任意房間..

這些房間沒有房頂你能飛到任意房間去砸墻 但是他們的關聯情況不同並且 花費的費用也不同

你要使他們的費用最低

1.  A  B 10萬元
2.  B  C 20萬元
3. A C 30萬元

你可以
1,2 30
1,3 40
2,3 50
顯然選擇 1,2
就用上面的kruskal
排序後 先是 a-b 判斷是否有相同根(打通?)沒有 就打通 10萬元 然後
b-c 判斷是否有相同的根 沒有就打通 然後繼續判斷
a-c 判斷已經打通了 跳過...
(當然也可以加一個sum統計打通情況3個房間 2個通道就行 打通一次sum++;當sum=n-1直接跳過節省時間)

prime 還沒理解透徹先過來占個時間....

關於最小生成樹(並查集)prime和kruskal