構造最小生成樹可以有多種演算法。其中多數演算法利用了最小生成樹的下列一種簡稱為mst的性質:假設n=(v,) 是乙個連通網,u是頂點集v的乙個非空子集。若(u,v)是一條具有最小權值邊的邊,其中u屬於u,v屬於v-u,則必存在一顆包含(u,v)的最小生成樹。
prim演算法的定義:
假設n=(p,e)是連通網,te 是 n 上最小生成樹中邊的集合。演算法從 u=(u0屬於v), te={}開始。重複執行下述操作:在所有u屬於u,v屬於v-u的邊,(u,v)屬於e中找一條最小的邊(u0,v0)併入集合te,同時v0併入u,直至u=v 為止。此時te中必有n-1條邊,則t=(v,)為n 的最小生成樹。
下面程式是來自大話資料結構的第七章圖的最小生成樹prim演算法的源**,**寫的很好,調理也很清晰,就是在lowcost和adjvex變數沒有弄懂,到底做什麼用,特別是adjvex陣列,後來通過不停的模仿計算機執行**,終於弄明白了,在**的第二十七行體現了adjvex陣列的作用,printf("(%d, %d)"
, adjvex[k], k);輸出符合條件的邊,adjvex[k]中儲存的正是具有最小權值邊的起點。
雖然是弄明白了,還是覺得不夠穩妥,翻看了資料結構(嚴慧敏),這本書裡面就講的比較清楚,而且**裡也通過結構體體現了lowcost陣列和adjvex陣列的關係。以下一段話摘自該書的第174頁:
為實現這個演算法需附設乙個輔助陣列closedge,以記錄從u到v-u具有最小代價的邊。對每個頂點vi屬於v-u,在輔助陣列中存在乙個相應分量closedge[i-1],它包括兩個域,其中lowcost儲存該邊上的權。顯然,closedge[i-1].lowcost = min。vex域儲存該邊依附的在u中的頂點。
記錄從頂點集 u 到 v-u的代價最小的邊的輔助陣列的定義:
structclosedge[max_vertex_num];
void minispantree_prim (mgraph g)
for( i = 1; i < g.numvertexes; i++)
j++;
} printf("(%d, %d)", adjvex[k], k);
lowcost[k] = 0;
for( j = 1; j < g.numvertexes; j++) }
}}
《大話資料結構》之Prim演算法
prim演算法作用是構造連通網的最小代價生成樹。演算法思想 以任意乙個點開始,找權值最小的一條邊,將此邊和兩個頂點加入最小生成樹集合,以最小生成樹的點集合中的每乙個點為起點,找尋終點不在集合中的權值最小的邊,並將結果加入集合,重複這個操作,直至所有的點都已經加入集合。圖的鄰接矩陣表示 typedef...
資料結構 Prim演算法
基本思想 加點 設g v,e 是具有n個頂點的連通網,t u,te 是g的最小生成樹,t的初始狀態為u u0 v te 重複執行下述操作 在所有u u,v v u的邊中找一條代價最小的邊 u,v 併入集合te,同時v併入u,直至u v。偽 演算法 prim 輸入 無向連通網g v,e 輸出 最小生成...
《大話資料結構》之Kruskal演算法
需要先對邊按權重排序,或者每次要查詢最小權重的邊。同時用類似於陣列鍊錶的方式,記錄每個頂點之間的連線關係。因為需要避免形成環路。typedef struct edge int find int parent,int f return f void minispantree kruskal mgrap...