1. 程式人生 > >最小生成樹模板 加 例題分析 (最小生成樹型別彙總)

最小生成樹模板 加 例題分析 (最小生成樹型別彙總)

最小生成樹:對於一個無向連通圖的最小生成樹,選取邊使得圖中每個頂點連通且花費最小。

在kruskal演算法中,集合A是一個森林,加入集合A中的安全邊總是圖中連線兩個不同連通分支的最小權邊。prim演算法中,集合A僅形成單顆樹,新增入集合A的安全邊總是連線樹與一個不在樹中的頂點的最小權邊。

kruskal在圖G(v,e)上的執行時間取決於不相交集合資料結構是如何實現的,模板中採用路徑優化的並查集,時間複雜度為O(1)。然後對時間複雜度有影響的就是對邊的排序,其最終時間複雜度O(E lgV);

prim演算法適用於邊多的,反之為kruskal演算法。鑑於kruskal程式碼的簡單易操作,例題解法均為kruskal演算法。

Kruskal虛擬碼

(1)對所有的邊從小到大排序

(2)while(n>1) do{

                取權值最小的邊(u,v);

                if(u,v不連通){

                        將(u,v)加入T;

                        n--;

                }

                將邊(u,v)從集合E中刪除;

         }

其中判斷兩點是否連通可使用並查集 

例題及擴充套件:(全部做完就可以成為入門菜鳥了)

基礎例題:

常用套路:n個結點的最小生成樹由n-1條邊構成,基礎題一般會提前連線好一些點,將這些點加入並查集並計算還需加入多少邊即可

難度:easy

題意:構建最小生成樹,會給出一些已經連線好的點。 

解析:將給出的已連線點提前加入並查集,計算還需加入多少條邊才能構成最小生成樹,然後加邊即可。

難度:easy

題意:構建最小生成樹,使得生成樹的最長邊減去最短邊所得的值最小。

解析:對於所有的邊從小到大排序,每次列舉一個區間【L,R】,區間長度為n-1,比較每次的結果求最小值

難度:medium

題意:給一張圖和多個子網,子網已經連通且花費固定,求把圖連通的最小花費)

解析:運用子集生成列舉子網,每次將子網中的點提前加入並查集,計算還需加入多少條邊才能構成最小生成樹,再構建               生成樹,比較每一次的結果取最小值

繼續學習一些概念:

(1)切割性質。假設所有邊權均不相同。設S為非空也非全集的V的子集,邊e是一個端點在S中,一個不在的邊中權值最小的,則圖所有的生成樹都包含e

(2)迴路性質。假設所有邊權均不相同。設C為圖中的任意迴路,邊e是C上權值最大的邊,則圖所有的生成樹不包含e。

增量最小生成樹:從包含n個點的空圖開始,依次加入m條帶權邊。每加入一條邊輸出當前圖的最小生成樹的權值(不連通輸出無解)每次求解完整的最小生成樹的時間複雜度為O(m^2logn),顯然不行。

可行節點數到達n-1時剛好構成一個最小生成樹,後面繼續加邊則根據迴路性質,加入邊e(u,v)時,找到u到v的唯一路徑上權值最大的邊,與e進行比較,刪除權值較大的邊把其他所有邊刪除。

最小瓶頸生成樹:給出帶權無向圖,求一顆生成樹,使其最大邊權儘可能小。(就是最小生成樹)

最小瓶頸路:給出帶權無向圖,求u到v的一條路徑,使得路徑上的最長邊儘量短。求最小生成樹,起點終點都在樹上的唯一路徑就是要找的路徑(uva10048)

最小瓶頸路最大邊長:求出最小生成樹,用dfs將其轉化為有根樹,計算maxcost【u】【v】,從v出發訪問一個新節點u時,考慮所有已經訪問過的結點x maxcost【x】【u】=max(maxcost【x】【v】,maxcost【v】【u】),複雜度為O(n^2)

次小生成樹:如果最小生成樹不唯一,則次小生成樹的權值與最小生成樹相同。

列舉要加入哪一條新邊,最小生成樹加入邊u-v後,圖中會出現一條迴路,所以要刪除的邊在最小生成樹u到v的路徑上,而且是這條路徑的最長邊。即次小生成樹一點可以由最小生成樹加一條邊,刪去一條邊得到。

所以只需要按照“每對結點間的最小瓶頸路”求出每對結點在最小生成樹唯一路徑上的最長邊maxcost【u】【v】

生成樹變種型別的問題:

難度:medium easy

題意:給出網路和某些特定的點,刪除網路上的邊使得這些特定點之間兩兩互不不連通,且花費最小。

解析:構建最大生成樹(邊按從大到小排序後執行kruskal演算法),當一條邊的兩端點都是給定的點時,花費加上這條邊,             反之加入最大生成樹。最後得到的是多個包含一個給定點的最大生成樹(一個端點也可以看做),最大生成樹之間               不相連,自己思考一下為什麼達到了題目的條件)

難度:medium

題意:城市有人口總數,城市之間有道路,將城市連線起來的花費為B。你可以免費連線兩個城市,免費連線的兩個城市人             口之和為A。找一個使得A/B最大的方案

解析:先求出最小生成樹,列舉u,v並刪除最小生成樹中u,v連線路徑上邊長最長的邊,比較沒種情況的結果