普里姆(prim)演算法,和克魯斯卡爾演算法一樣,是用來求加權連通圖的最小生成樹的演算法。
###基本思想
對於圖g而言,v是所有頂點的集合;現在,設定兩個新的集合u和t,其中u用於存放g的最小生成樹中的頂點,t存放g的最小生成樹中的邊。 從所有uєu,vє(v-u) (v-u表示出去u的所有頂點)的邊中選取權值最小的邊(u, v),將頂點v加入集合u中,將邊(u, v)加入集合t中,如此不斷重複,直到u=v為止,最小生成樹構造完畢,這時集合t中包含了最小生成樹中的所有邊。
演算法簡單描述
1).輸入:乙個加權連通圖,其中頂點集合為v,邊集合為e;
2).初始化:vnew = ,其中x為集合v中的任一節點(起始點),enew = {},為空;
3).重複下列操作,直到vnew = v:
a.在集合e中選取權值最小的邊,其中u為集合vnew中的元素,而v不在vnew集合當中,並且v∈v(如果存在有多條滿足前述條件即具有相同權值的邊,則可任意選取其中之一);
b.將v加入集合vnew中,將邊加入集合enew中;
4).輸出:使用集合vnew和enew來描述所得到的最小生成樹。
以上圖g4為例,來對普里姆進行演示(從第乙個頂點a開始通過普里姆演算法生成最小生成樹)。
初始狀態:v是所有頂點的集合,即v=;u和t都是空!
第1步:將頂點a加入到u中。
此時,u=。
第2步:將頂點b加入到u中。
上一步操作之後,u=, v-u=;因此,邊(a,b)的權值最小。將頂點b新增到u中;此時,u=。
第3步:將頂點f加入到u中。
上一步操作之後,u=, v-u=;因此,邊(b,f)的權值最小。將頂點f新增到u中;此時,u=。
第4步:將頂點e加入到u中。
上一步操作之後,u=, v-u=;因此,邊(f,e)的權值最小。將頂點e新增到u中;此時,u=。
第5步:將頂點d加入到u中。
上一步操作之後,u=, v-u=;因此,邊(e,d)的權值最小。將頂點d新增到u中;此時,u=。
第6步:將頂點c加入到u中。
上一步操作之後,u=, v-u=;因此,邊(d,c)的權值最小。將頂點c新增到u中;此時,u=。
第7步:將頂點g加入到u中。
上一步操作之後,u=, v-u=;因此,邊(f,g)的權值最小。將頂點g新增到u中;此時,u=v。
此時,最小生成樹構造完成!它包括的頂點依次是:a b f e d c g。
1. 基本定義
// 鄰接矩陣
typedef struct _graph
graph, *pgraph;
// 邊的結構體
typedef struct _edgedata
edata;
graph是鄰接矩陣對應的結構體。
vexs用於儲存頂點,vexnum是頂點數,edgnum是邊數;matrix則是用於儲存矩陣資訊的二維陣列。例如,matrix[i][j]=1,則表示"頂點i(即vexs[i])"和"頂點j(即vexs[j])"是鄰接點;matrix[i][j]=0,則表示它們不是鄰接點。
edata是鄰接矩陣邊對應的結構體。
2. 普里姆演算法
/*
void prim(graph g, int start)
j++;
}// 經過上面的處理後,在未被加入到最小生成樹的頂點中,權值最小的頂點是第k個頂點。
// 將第k個頂點加入到最小生成樹的結果陣列中
prims[index++] = g.vexs[k];
// 將"第k個頂點的權值"標記為0,意味著第k個頂點已經排序過了(或者說已經加入了最小樹結果中)。
weights[k] = 0;
// 當第k個頂點被加入到最小生成樹的結果陣列中之後,更新其它頂點的權值。
for (j = 0 ; j < g.vexnum; j++)
}// 計算最小生成樹的權值
sum = 0;
for (i = 1; i < index; i++)
sum += min;
}// 列印最小生成樹
printf("prim(%c)=%d: ", g.vexs[start], sum);
for (i = 0; i < index; i++)
printf("%c ", prims[i]);
printf("\n");
}
普里姆(Prim)求最小生成樹
一 普里姆 prim 演算法 1.基本思想 設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。即 1 從連通網路 g 中的某一頂點...
普里姆演算法(Prim演算法求最小生成樹)
普里姆演算法的基本思想 普里姆演算法是一種構造最小生成樹的演算法,它是按逐個將頂點連通的方式來構造最小生成樹的。時間複雜度為o n 2 從連通網路n 中的某一頂點u0出發,選擇與它關聯的具有最小權值的邊 u0,v 將其頂點加入到生成樹的頂點集合u中。以後每一步從乙個頂點在u中,而另乙個頂點不在u中的...
最小生成樹 普里姆演算法 Prim
最小生成樹 的7到12行先初始化了矩陣第一行的值,本來很奇怪,那其他行的值怎麼辦?看到最後的28 35行才知道,原來從下面開始會逐步初始化與上個頂點相關的邊的值,最後能夠把全部都初始化了。截圖如下 演算法定義 1 輸入 乙個加權連通圖,其中頂點集合為v,邊集合為e 2 初始化 v new 其中x為集...