講解 prim演算法《最小生成樹》

2022-05-07 10:42:06 字數 2048 閱讀 3367

最小生成樹的方法一般比較常用的就是kruskal和prim演算法

乙個是按邊從小到大加,乙個是按點從小到大加,兩個方法都是比較常用的,都不是很難。。。

kruskal演算法在本文裡我就不講了,本文的重點是講講prim演算法,之前一直沒學過,只是了解了思想,原本以為很難,結果很好理解

prim 即可以用過鄰接矩陣又可以用鄰接鍊錶,不過鄰接鍊錶的時間優化不了多少,但是還是可以優化很多空間的

prim演算法是先列舉第乙個點,將選好的點加入點集v,沒選的點在點集u,然後在u集中找距離v集最近乙個點,然後將其加入u集

我們還是用圖來舉例說明

我們來模擬一遍這個過程。。。

首先,lowcost表示從當前點到v集的最小距離,mst表示當前點到v集最小的那個v集的點

我們先從1點開始。。。

判斷和1點相連的點,lowcost[2]=6,lowcost[3]=1,lowcost[4]=5,lowcost[5]=lowcost[6]=inf

mst[2]=1,mst[3]=1,mst[4]=1;

然後跑整個圖的點,找到最小的lowcost並將這個點加入v集,從u集刪除(刪除操作即為把lowcost賦值為0)

因為v集多了3,就更新整個圖lowcost[2]=5,lowcost[4]=5,lowcost[5]=6,lowcost[6]=4;

mst[2]=3,mst[4]=1,mst[5]=3,mst[6]=3;

然後找整個u集發現lowcost最小是6點,v集加入6點,更新u集

lowcost[2]=5,lowcost[4]=2,lowcost[5]=6

mst[2]=3,mst[4]=6,mst[5]=3

然後找lowcost最小的4點,加入v集,更新u集

lowcost[2]=5,lowcost[5]=6

mst[2]=3,mst[5]=3

找lowcost最小的點2,加入v集,更新u集

lowcost[5]=3,mst[5]=2

加入v集,所有點都已經加入,完成操作,輸出ans=15

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

#define maxn 1005

9using

namespace

std;

1011

intn,m,dis[maxn][maxn],ans;

12int

lowcost[maxn],mst[maxn];

1314

intread()

17while(ch>='

0'&&ch<='9')

18return xx*ff;19}

2021

void prim(int

u)26

}27 mst[u]=0;lowcost[u]=0;28

int minid=0,minn=0x3f3f3f,tot=1;29

while(tot

37 tot++;

38 ans+=minn;

39 mst[minid]=0;lowcost[minid]=0;40

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

45}

46} 47}

4849

intmain()

57 prim(1

);58 printf("

%d\n

",ans);59}

60/*

616 10

621 3 1

631 2 6

641 4 5

652 3 5

663 4 5

672 5 3

683 5 6

695 6 6

703 6 4

714 6 2

72*/

prim

最小生成樹(prim演算法)

最小生成樹是資料結構中圖的一種重要應用,它的要求是從乙個帶權無向完全圖中選擇n 1條邊並使這個圖仍然連通 也即得到了一棵生成樹 同時還要考慮使樹的權最小。prim演算法要點 設圖g v,e 其生成樹的頂點集合為u。把v0放入u。在所有u u,v v u的邊 u,v e中找一條最小權值的邊,加入生成樹...

最小生成樹 Prim演算法

prim 演算法 以領接矩陣儲存 圖g bool b i 表示頂點i是否被訪問,初始化時候memset b,false,sizeof b b 0 value,表示從第0個節點開始。用value i 表示節點i到最小生成樹a中定點的最小距離。例如value 1 a 0 1 int sum記錄權值和 i...

最小生成樹 prim 演算法

一 演算法描述 假設存在連通帶權圖g v,e 其中最小生成樹為t,首先從圖中隨意選擇一點s屬於v作為起始點,並將其標記後加入集合u 中。然後演算法重複執行操作為在所有v屬於u,u屬於v u的邊 v0,u0 屬於e中找一條代價最小的邊並加入集合t,同時將u0併入u,直到u v為止。這是,t中必有n 1...