現在是凌晨時分 本來很早就想寫了 被一道搜尋題卡到現在 至今沒有a出 等a出以後 一定要寫出來 ....
prim:它是 基於 圖的頂點 的演算法
其實 這個演算法 是很容易理解的
首先 你任意選取乙個點 加入mst集合中 這裡的mst即最小生成樹集合
然後你對所有不屬於mst的點 進行迴圈遍歷尋找權值最小的邊
並且 再每加入乙個點後 就重新整理其餘點到這個mst集合的相對最短距離(這是核心步驟)
個人 感覺prim演算法 還是很基礎的 當你不考慮heap優化的情況下
我們還是 那道題說說吧
1 #include 2 #includeview code3#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 }
這邊 我給出的是鄰接矩陣的實現方式 你可以自己去實現 鄰接表的方式 而我會在下次 講到尤拉圖的時候 使用鄰接表
其實 這段以前寫過的** 還有很多可以優化的細節 例如: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 ...