普里姆演算法(Prim演算法) 最小生成樹演算法 貪心

2022-08-30 07:48:12 字數 2021 閱讀 8382

普里姆演算法(prim演算法):圖論中的一種演算法,可在加權連通圖里搜尋最小生成樹。意即由此演算法搜尋到的邊子集所構成的樹中,不但包括了連通圖里的所有頂點(英語:vertex (graph theory)),且其所有邊的權值之和亦為最小。該演算法於2023年由捷克數學家沃伊捷赫·亞爾尼克(英語:vojtěch jarník)發現;並在2023年由美國計算機科學家羅伯特·普里姆(英語:robert c. prim)獨立發現;2023年,艾茲格·迪科斯徹再次發現了該演算法。因此,在某些場合,普里姆演算法又被稱為djp演算法、亞爾尼克演算法或普里姆-亞爾尼克演算法。

發現了乙個我看懂的文章:

lowcost[i]:表示以i為終點的邊的最小權值,當lowcost[i]=0說明以i為終點的邊的最小權值=0,也就是表示i點加入了mst

mst[i]:表示對應lowcost[i]的起點

以v1為起始點,將各點與v1的聯絡存入lowcost陣列中,mst陣列都預設為v1起點

遍歷lowcost陣列,找最小值(min),將最小值(min)存入sum中,並將lowcost[最小值下標(minid)]賦值為0(表示此點已被選)

之前的lowcost陣列儲存的是各點與v1的聯絡,再次遍歷lowcost陣列,判斷各點與新加進來的點(v3)的聯絡是否小於之前的,小於就覆蓋

遍歷lowcost陣列,找最小值(min),將最小值(min)存入sum中,並將lowcost[最小值下標(minid)]賦值為0(表示此點已被選)

之前的lowcost陣列儲存的是各點與v1 v3的聯絡,再次遍歷lowcost陣列,判斷各點與新加進來的點(v6)的聯絡是否小於之前的,小於就覆蓋

下面的都是這樣,以此類推...

輸入:

6 10

1 2 6

1 3 1

1 4 5

2 3 5

2 5 3

3 4 5

3 5 6

3 6 4

4 6 2

5 6 6

輸出:

v1-v3=1

v3-v6=4

v6-v4=2

v3-v2=5

v2-v5=3

15**:

#include #include 

using

namespace

std;

#define max 100

#define maxcost 0x7fffffff //

int型最大值

void prim(int graph[max],int

n) mst[

1]=0

;

for(int i=2;i<=n;i++)//

計算n-1個點

}cout

<

sum+=min;

lowcost[minid]=0

;

for(int j=2;j<=n;j++)}}

cout

<

}int

main()

}//構建圖g

for(int k=1;k<=m;k++)

prim(graph,n);

return0;

}

最小生成樹演算法 普里姆Prim演算法

1.鄰接矩陣儲存 cpp view plain copy 圖的鄰接矩陣儲存表示 define infinity int max define max vertex num 20 typedef enum graphkind typedef enum status typedef struct arc...

最小生成樹 普里姆演算法 Prim

最小生成樹 的7到12行先初始化了矩陣第一行的值,本來很奇怪,那其他行的值怎麼辦?看到最後的28 35行才知道,原來從下面開始會逐步初始化與上個頂點相關的邊的值,最後能夠把全部都初始化了。截圖如下 演算法定義 1 輸入 乙個加權連通圖,其中頂點集合為v,邊集合為e 2 初始化 v new 其中x為集...

普里姆演算法(Prim演算法求最小生成樹)

普里姆演算法的基本思想 普里姆演算法是一種構造最小生成樹的演算法,它是按逐個將頂點連通的方式來構造最小生成樹的。時間複雜度為o n 2 從連通網路n 中的某一頂點u0出發,選擇與它關聯的具有最小權值的邊 u0,v 將其頂點加入到生成樹的頂點集合u中。以後每一步從乙個頂點在u中,而另乙個頂點不在u中的...