首先描述一下prim演算法的步驟,首先將所有的點分為兩類,第一類是在生成樹中的節點,第二類是不在生成樹中的節點,我們首先任取乙個節點放入生成樹中,然後找到距離這棵樹(當前狀態就是這個點)最近的點,然後將其放入到生成樹中,之後再進行尋找距離這棵樹最近的點,直到將所有的節點都加入到生成樹中。
我們發現其實主要的思想方法就是貪心法,那麼這個貪心法到底正不正確呢(貪心法好像老是叫人不放心啊)?讓我們來證明一下,我們利用反證法,假設我們不選擇距離這棵樹最近的點(權值最小的邊),然後生成了一顆完整的樹,我們假設這是最小生成樹,之後我們將剛才那個權值最小的邊加入這棵樹中,因為這是一顆生成樹,所以加入了一條邊以後一定會產生乙個環,那麼在這個環中,任意去掉乙個權值比這條邊大的邊,可以發現這棵樹還是乙個完整的生成樹,但是卻比原來小,和假設矛盾,所以我們的貪心策略的到證明。
這裡我們有兩個地方可以進行優化,首先是圖的儲存和邊的查詢,如果使用鄰接表的話會比使用鄰接矩陣快,其次,找到權值最小的邊如果使用堆或者優先佇列的話要比普通遍歷快。
//// main.cpp
// prim
//// created by 張嘉韜 on 16/3/19.
//#include #include using namespace std;
int u[100],v[100],w[100],frist[100],nex[100],n,m,dis[100],book[100],sum;
int const maxn=99999999;
void change(int k)//use k point to change
for(int i=1;i<=2*m;i++)
for(int i=1;i<=n;i++) dis[i]=maxn;
change(1);
for(int i=2;i<=n;i++)
cout 最小生成樹是一副連通加權無向圖中一棵權值最小的生成樹。在一給定的無向圖 g v,e 中,u,v 代表連線頂點 u 與頂點 v 的邊 即 u,v in e 而 w u,v 代表此邊的權重,若存在 t 為 e 的子集 且 v,t 為樹,使得 w u,v w t sum w u,v 的 w t 最小,則此... 最小生成樹 prim 網路的生成樹中的邊帶權值,將生成樹各邊的權值加起來稱為生成樹的權,權值最小的生成樹稱為為最小生成樹。設g v,e 是連通帶權圖,v prim演算法基本思想 首先置s 然後,只要s是v的真子集,就進行如下貪心選擇 選取滿足條件i s,j v s,且c i j 最小的邊,將頂點j新... 最小生成樹 3條構造最小生成樹的準則 只能使用該網路中的邊來構造最小生成樹 只能使用恰好n 1條邊來聯結網路中的n個結點 選用的這個n 1條邊不能構成迴路。mst性質 假設n v,是乙個連通網,u是頂點集合v的乙個非空子集。若 u,v 是一條具有最小值 代價 的邊,其中u屬於u,v屬於v u 即u對...C 之最小生成樹演算法(Prim)
貪心演算法之最小生成樹(Prim)
最小生成樹 Prim演算法和Kruskal演算法