Prim(普里姆)求小生成樹 模板

2021-08-04 07:42:48 字數 2259 閱讀 6383

普里姆(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為集...