接著上次的寫(本來打算過幾天再更的...)
還是上次的栗子:
如果說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 ...