最小生成樹Prim演算法(鄰接矩陣和鄰接表)

2022-03-11 22:05:58 字數 1943 閱讀 2665

最小生成樹,普利姆演算法.

簡述演算法:

先初始化一棵只有乙個頂點的樹,以這一頂點開始,找到它的最小權值,將這條邊上的令乙個頂點新增到樹中

再從這棵樹中的所有頂點中找到乙個最小權值(而且權值的另一頂點不屬於這棵樹)

重複上一步.直到所有頂點併入樹中.

圖示:

注:以a點開始,最小權值為1,另一頂點是c,將c加入到最小生成樹中.樹中 a-c

在最小生成樹中的頂點找到乙個權值最小且另一頂點不在樹中的,最小權值是4,另乙個頂點是f,將f併入樹中, a-c-f

重複上一步驟,a-c-f-d, a-c-f-d-b, a-c-f-d-b-e.

鄰接矩陣的實現

我又構建了乙個鄰接矩陣(prim_tree),將我們求出的最小生成樹寫入其中.

我們還需要乙個visited陣列,來確定乙個頂點是否已被納入最小生成樹中.

1)初始化,visited陣列,prim_tree節點資訊,矩陣.1-11,41-55行

2)將乙個頂點併入樹(prim_tree)中.以這個頂點開始,進行遍歷尋找最小權值.

這裡用了三層迴圈巢狀.

i這一層的作用是遍歷圖的節點資訊,我們要將所有節點都納入樹中.

j這一層的作用是遍歷樹的節點資訊.(我們是通過visited陣列來確定乙個節點是否屬於最小生成樹的,19行,if的作用)

k這一層的作用是在j節點所在所在矩陣的行中找到最小權值.

(注:j和k配合,找到樹中的最小權值(最小權值的另乙個節點沒有被納入樹中,23行if的作用).j查詢的節點資訊的下標,但矩陣是正方形的,所以j既是節點資訊的下標,又是該節點在矩陣中的列位置.而k則在j這一列查詢最小權值.當j將樹遍歷一遍,這時會找到乙個最小權值,這個最小權值的另乙個頂點就是我們將要納入樹中的節點.)

3)將上面獲得的資訊寫入樹中.(寫入時也要判斷該節點是否已被納入樹中.沒有納入樹中的節點才會將其納入樹中.)

1

//最小生成樹prim演算法

2static

void init_prim(graph * graph, graph *prim_tree);

3void prim(graph * graph, graph *prim_tree)429

}30}31

}32//min power

33if ( !visited[power_k] )

3438}39

}4041static

void init_prim(graph * graph, graph *prim_tree)

4254

}55 }

上述**適用於連通圖.

如果想執行這個程式,到找原始碼,將上面的**粘到裡面就可以了.

鄰接表的實現

演算法和矩陣一樣,只是由於資料結構不同,在**上有些差別.

static

void init_prim(graph * graph, graph *prim_tree);

void g_prim(graph * graph, graph *prim_tree)

tmp = tmp->next;}}

}if ( !visited[pos] )

else

visited[pos] = true

; }

}}static

void init_prim(graph * graph, graph *prim_tree)

prim_tree->vertexs = graph->vertexs;

}

到裡找到原始碼,將上述**粘到原始碼中,就可以了.

由於本人水平有限,不足之處還望大家不吝指教.

資料結構 鄰接矩陣的最小生成樹Prim演算法

include iostream include iomanip using namespace std define max vertex num 10 最大頂點個數 define infinity 32768 typedef char vertype typedef intvrtype type...

鄰接矩陣 最小生成樹 普里姆演算法

風雨難洗心痕,滄桑不滅情傷。莫要輕言亙古,離散才看荒涼。include stdio.h typedef char vertextype 頂點 typedef int edgetype 邊的權值 define maxvex 100 define infinity 65535 鄰接矩陣 typedef ...

最小生成樹之prime演算法(鄰接矩陣實現)

概念 生成樹 乙個連通圖的生成樹,指的是該圖的乙個子圖 沒有形成迴路 他包含圖的所有結點,但只有把所有結點連線在一起的n 1條必要的邊 最小生成樹 乙個連通圖的生成樹中,所有邊的權值加起來最小的生成樹 稱為最小生成樹 簡介 prime演算法可在加權連通圖里搜尋最小生成樹。即 所有邊的權值之和為最小。...