關於最小生成樹(並查集)prime和kruskal
阿新 • • 發佈:2019-03-28
第一次 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 intr=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