普里姆(prim)演算法
****************************/
#define m 6
#define max 100
#include
#include
int cost[m][m]=;
int lowcost[m],adjvex[m],s[m]; //其中lowcost陣列是選中定點到圖中頂點的最小權值
//adjvex陣列存放的是到各個頂點的前驅頂點的位置
//s陣列是標誌陣列,裡面的0,1標誌著頂點是否選中過.
void prim(int n, int v0) //n是頂點個數. vo是初始頂點位置
for(w = 0; w < n; w++)
s[w] = 0; //標誌陣列的初始化
s[v0] = 1;
for(i = 1 ; i < n; i++) //由於連線n個點需要n-1條路徑,故是i=1到i=n共n-1次迴圈
}//迴圈過後,min裡面就是lowcost陣列裡面最小的權值,而u就是最小權值對應的頂點位置也就是下乙個要被選中的頂點
s[u] = 1;
printf("%d---%d",adjvex[u],u); //輸出路徑
for(k = 0; k < n; k++) //這個迴圈是將上面選定的頂點u到各個頂點的權值與lowcost陣列的對應權值進行比較,找出最小值進行替換
}
printf("/n"); }
}int main()
/*************************************
演算法分析:普里姆演算法實際上就是構造帶有權值的圖的最小生成樹的演算法.
演算法的最大的特點就是引用了三個輔助陣列:
(1)最小權值陣列(lowcost),該陣列裡面存放的是已選中的頂點集中各個頂點到未被選中的頂點的最小權值.
(2)路徑存放陣列(adjvex),該陣列裡面存放的是頂點集外的各頂點(還未被選中的頂點)到已選頂點集的哪個頂點權值最小,也就是放的是前驅 頂點
(3)標誌陣列(s),該陣列裡面存放的是陣列下標對應的各頂點是否被選中的標誌,也就是說只存放0,1.
演算法思想:我們的目的是從乙個頂點出發,尋找一條路徑通過所有的頂點,而這條路徑的限制是要求權值最小.
於是,我們從乙個頂點出發,不停向這個頂點集裡面新增頂點(新增頂點的過程其實就是尋找路徑的過程).而如何保證走的路徑的權值是最小的呢?這裡我們就引入了lowcost陣列,來儲存頂點集中的頂點到還未走過的頂點的權值大小.故只要遍歷lowcost陣列,通過選擇排序(中間變數min)就能很輕鬆地找到權值最小的頂點(程式中的u).而這個頂點就是下乙個要走的頂點.而由於不能走重複的頂點.故在排序比較的時候就要加上乙個條件:這個頂點未走過.這樣就需要引入標誌陣列(s).
選中下乙個頂點後,下一步動作就是什麼呢?
下一步動作就是繼續尋找頂點,這裡就需要更新lowcost陣列的值了,因為這時的頂點集裡面的頂點已經增加到2個了(lowcost裡面的值是頂點集中的頂點到未選中頂點的權值最小值).
於是通過乙個迴圈將選中頂點的鄰接矩陣裡面的值與lowcost裡面的值一一進行比較,找到更小的就進行替換.
而頂點找到後,要如何輸出走過的路徑呢?
這裡需要引入的就是路徑存放陣列(adjvex).
***************************************/
資料結構 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 輸出 最小生成...
大話資料結構之Prim演算法
構造最小生成樹可以有多種演算法。其中多數演算法利用了最小生成樹的下列一種簡稱為mst的性質 假設n v,是乙個連通網,u是頂點集v的乙個非空子集。若 u,v 是一條具有最小權值邊的邊,其中u屬於u,v屬於v u,則必存在一顆包含 u,v 的最小生成樹。prim演算法的定義 假設n p,e 是連通網,...
《大話資料結構》之Prim演算法
prim演算法作用是構造連通網的最小代價生成樹。演算法思想 以任意乙個點開始,找權值最小的一條邊,將此邊和兩個頂點加入最小生成樹集合,以最小生成樹的點集合中的每乙個點為起點,找尋終點不在集合中的權值最小的邊,並將結果加入集合,重複這個操作,直至所有的點都已經加入集合。圖的鄰接矩陣表示 typedef...