最小生成樹問題的概念在克魯斯卡爾演算法解釋過了,克魯斯卡爾演算法是從邊的角度來解決最小生成樹問題,而普里姆演算法從點的角度來解決。若在解決問題過程中需要遍歷圖的所有點,則普里姆演算法更好。
普里姆演算法更像構建一棵樹。聯想我們構建二叉樹的過程,從根節點出發,構建左右子樹,再以左右子樹為根節點,構建它們的左右子樹。普里姆演算法設乙個點集v,初始時只有源點,從點集的點出發遍歷所有以它們為起點的邊,找到其中權值最小的邊,且這條邊的終點不在點集v中,然後將終點加入點集,再從點集v中的所有點出發,找一條權重最小的邊。從點集中的點向外發散,構建起最小生成樹。
初始化mincost和mst陣列,mincost初始化為源點到其他每個點的直接距離,mst陣列初始化為1。
從點集出發,找一條終點不在點集中的權值最小的邊,將該邊的終點加入點集,即將該點的mincost置為0。
因為加入了乙個點,所以要更新mincost陣列。
重複2、3過程,直到所有點都加入點集。
/*
普里姆演算法,側重於點來解決最小生成樹問題。普里姆演算法是以某頂點為起點,逐步找各頂點上最小權值的邊
來構建最小生成樹。核心過程是設乙個點集v,最開始只有源點,從v集中的每個點出發找一條終點不在v集的權值最
小的邊。找到後將邊的終點加入點集v中,將權值累加起來。再從v集的每個點出發找一條權值最小的邊。重複此過
程,直到所有點都加入到v集中。
涉及到的資料結構有:
1、mincost陣列,mincost[i]表示v集中的點到點i的最小權值,將mincost置為0表示i點已經加入v集了
2、mst陣列,mst[i]表示mincost[i]所對應的v集中的點。即mst[i]->i是當前v集的點的所有邊中最小的一條
3、gra陣列,用於儲存圖的權值
演算法過程:
1、初始化mincost和mst陣列,mincost初始化為源點到每個點的距離,mst初始化為1
2、從v集出發,找一條終點不在v集中的權值最小的邊,記錄最小權值和對應終點,找到後將終點加入v集,即
將該點的mincost置為0。
3、因為加入了乙個點,所以要更新mincost陣列。
4、重複2、3,直到所有點都加入v集
*/#include#define max 101
#define inf 0x7fffffff //inf表示兩條邊不相連
using namespace std;
int gra[max][max];
int prim(int n)
for(int i=2;i<=n;i++)
}} return res;
}int main()
cost=prim(n);
cout
}
最小生成樹(普里姆演算法)
關於什麼是prim 普里姆演算法 在實際生活中,我們常常碰到類似這種一類問題 如果要在n個城市之間建立通訊聯絡網,則連通n個城市僅僅須要n 1條線路。這時。我們須要考慮這樣乙個問題。怎樣在最節省經費前提 下建立這個通訊網.換句話說,我們須要在這n個城市中找出乙個包括全部城市的連通子圖,使得 其全部邊...
最小生成樹 普里姆演算法
普利姆演算法 最小生成樹 把所有頂點分為 2 個集合 乙個表示已經選中的頂點集合 另乙個表示未選中的頂點集合 例如 a,b,c,d,e 五個頂點 1.任意選擇乙個頂點 放在 已經選中的頂點集合中 假如 選a 2.將a 與未選中頂點集合中 選擇 一頂點 條件 權值最小的乙個頂點 如何權值相同 則任意選...
最小生成樹 普里姆演算法
當我們要求解n個連線城市之間的路線問題,就需要我們進行乙個計算。而在連通網上面,我們稱這類問題為最小代價生成樹 最小生成樹 問題。今天我們主要討論的是用普里姆演算法實現最小生成樹。如圖所示,a圖是乙個有權值的連通圖。要對其進行最小生成樹求解,假設初始點為v1,尋找與1有關係而且權值最小的頂點 圖源嚴...