1. 程式人生 > >資料結構-最小生成樹演算法

資料結構-最小生成樹演算法

最小生成樹經典演算法主要是:Prim和Kruskal演算法,其核心都是MST性質:假設G=(V,E)是一個無向連通圖,U是頂點集V的一個非空子集。若(u,v)是一條具有最小權值的邊,其中u包含於U,v包含於V,則必存在一顆包含邊(u,v)的最小生成樹。

Prim演算法:我所理解的prim的演算法就好像動態規劃式的坐公交。

第一步:根據MST性質,我們選擇了一條邊V2-V4,我們準備一個集合U用來存放已聯通部分的定點集合,如果我們被告知從某點出發的話,那麼U的初始狀態就是U={V1},另外,我們用一個集合T存放路徑,由圖知,我們可以由v1到達的頂點的集合是{V2,V4,V5},選取權值最小,我們會到達V5,

此時U={V1,V5},T={V1V5};

這個時候我們就有兩個出發站點了,我們可以從V1到V4,V2,因為V5我們已經打通了,我們也可以由V5到V2,V3,選取權值最小,

此時U={V1,V5,V2},T={V1V5,V1V2};

下一步,U={V1,V5,V2,V4},T={V1V5,V1V2,V2V4};

下一步U={V1,V5,V2,V4,V6},T={V1V5,V1V2,V2V4,V4V6};

下一步U={V1,V5,V2,V4,V6,V3},T={V1V5,V1V2,V2V4,V4V6,V6V3};

此時,所有頂點已經包含在U中,我們已經找到最小生成樹,T就是所有邊的集合。

=====兩個演算法比較的核心寫在這裡,prim是從我所擁有的站點出發,尋找下一個離我最近,未到達的站點,kruskal的核心是我什麼都不管,我就找最小的權值邊,但我有一點會考慮,不形成環路,如果最小的邊會形成環,我就找倒數第二小的權值,直到形成最小聯通圖。

 

Kruskal演算法:我什麼都不管,我就找最小的權值邊,但我有一點會考慮,不形成環路,如果最小的邊會形成環,我就找倒數第二小的權值,直到形成最小聯通圖。

資料結構