最小生成樹之Prim的應用

2022-05-13 19:27:16 字數 1264 閱讀 9546

現在是凌晨時分 本來很早就想寫了 被一道搜尋題卡到現在 至今沒有a出 等a出以後 一定要寫出來 ....

prim:它是 基於 圖的頂點 的演算法

其實 這個演算法 是很容易理解的

首先 你任意選取乙個點 加入mst集合中 這裡的mst即最小生成樹集合

然後你對所有不屬於mst的點 進行迴圈遍歷尋找權值最小的邊

並且 再每加入乙個點後 就重新整理其餘點到這個mst集合的相對最短距離(這是核心步驟)

個人 感覺prim演算法 還是很基礎的 當你不考慮heap優化的情況下

我們還是 那道題說說吧

1 #include 2 #include 

3#define max 100000000

4int map[505][505];//

鄰接矩陣

5int dis[505];//

距離 並且指這條邊是以dis[i]的i為結尾的

6int visited[505];7

intn,m;89

intprim()

1026}27

if(min==max)//

如果這個if成立相當於 上面沒有乙個j進入mst中 所有可以直接break

28break

;29 ans+=min;

30 visited[t]=1;31

32for(k=2;k<=n;k++)

333738}

39return

ans;40}

4142

intmain()

4354

for(i=1;i<=m;i++)

5559 min=max;

60for(i=1;i<=n;i++)

6166 printf("

%d\n

",min+prim());67}

68 }

view code

這邊 我給出的是鄰接矩陣的實現方式  你可以自己去實現 鄰接表的方式   而我會在下次 講到尤拉圖的時候 使用鄰接表

其實 這段以前寫過的** 還有很多可以優化的細節 例如:vis陣列 用bool實現   max的設定使用16進製制來實現

我還想提的一點是: prim演算法的思想 與 最短路中dijkstra的思想 實在是太像了

最大的區別就是:dijk陣列含義上的不同:這裡是指頂點到mst集合的最短距離 dijkstra演算法中是指頂點到起始點的最短距離

我想 對於每個演算法 了解它的思想 才是最重要的

最小生成樹之Prim

a 生成樹 b 未被訪問過的點的集合 pre i 生成樹中i的前驅節點。a中的dis i 生成樹中包含點i的邊的長度。b中的dis i i到a的最短距離 vis 標記是否遍歷過 是否屬於a prim演算法的思想 1.任選一點,不妨選擇第乙個點,加入生成樹a。2.遍歷b,尋找一點u,使其到a的距離最小...

最小生成樹 Prim

include stdio.h include stdlib.h include io.h include math.h include time.h define ok 1 define error 0 define true 1 define false 0 define maxedge 20 ...

最小生成樹 prim

演算法模型 由任意乙個頂點開始 將此頂點存入s集,剩餘頂點存入t集合 每次遍歷頂點,取一條能夠連線s與t最短邊e,直到所有頂點全部加入s include include define inf 1 30 int n,m,vis 110 low 110 int map 110 110 int init ...