OI學習筆記 最小生成樹之Kruskal演算法

2022-05-24 09:21:08 字數 1881 閱讀 8978

接著上次的寫(本來打算過幾天再更的...)

還是上次的栗子:

如果說prim是從點的角度考慮,那麼kruskal就是從邊的角度考慮。

kruskal也是從貪心的角度解決的——從小到大連線每一條邊,當我們選擇一條邊時,判斷是否兩個點是否在同乙個聯通塊中,如果不在則選擇該邊。這樣選擇了n-1條邊以後,所鏈結的就算是我們的mst了。

1)快排

2)按邊權從小到大進行列舉

1.判斷這條邊是否連線兩個不在同一聯通塊的兩點,如果是則連線

3)迴圈n-1次

我們擦掉栗子上的線,來手算一遍kruskal...

1)什麼都沒有

2)當然是先選最短的啦

3)第二短的20

3)這時,如果我們連線一根第三短的30,如果(1,4)被排在前面的話,我們發現,1和4已經在同乙個並查集裡面,不能連線

4)所以我們繼續選擇(2,3)

5)完成,簡單易懂.

不過問題是**實現。。。

好吧,繼續寫。

以下是洛谷2330的**(其實就是mst

)(我可不是抄,我是看懂了之後再抄的

//

最小生成樹 kruskal演算法 洛谷2330

#include#include

#include

#include

#include

using

namespace

std;

struct

road

r[10001

];int

n,m,sz;

int to[20005],nex[20005],las[305

];void ins(int x,int

y)inline

bool comp(const road &a,const road &b)

void

init()

bool check(int x,int

y) }

return u[y]==false;}

void

solve()

}}int

main()

最小生成樹的內容就這麼多,最後附上幾道例題

區域網修復公路

火車運輸(noip2013)

星球大戰

原始碼會在近段時間貼出(再也不抄**了...)

國王的煩惱 藍橋杯(最小生成樹 kru)

歷屆試題 城市建設 時間限制 1.0s 記憶體限制 256.0mb 問題描述 棟棟居住在乙個繁華的c市中,然而,這個城市的道路大都年久失修。市長準備重新修一些路以方便市民,於是找到了棟棟,希望棟棟能幫助他。c市中有n個比較重要的地點,市長希望這些地點重點被考慮。現在可以修一些道路來連線其中的一些地點...

最小生成樹筆記

兩種常用的最小生成樹演算法 普里姆演算法 prim,時間複雜度o n 2 引入乙個輔助陣列,便巧妙實現之 克魯斯卡爾演算法 kruskal 時間複雜度o e log e prim演算法是根據點找邊,適合稠密圖。kruskal演算法一直都是找最小邊,適合稀疏圖。prim演算法的偽 void minis...

學習kruskal(最小生成樹)筆記

先上比葫蘆畫瓢的 includeusing namespace std struct edge e 1001 int sum 0 int all 0 int n,m int f 9 void quicksort int left,int right i left j right while i j ...