最小生成樹的方法一般比較常用的就是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 #include8prim#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演算法)
最小生成樹是資料結構中圖的一種重要應用,它的要求是從乙個帶權無向完全圖中選擇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...