Prim最小生成樹 優先佇列優化

2022-03-24 09:13:48 字數 1333 閱讀 4219

處理何種問題:求解無向連通圖的最小生成樹,適合於稠密圖,即點少邊多的無向圖。

效能:時間複雜度為 o(v * loge),v為點的個數,e為邊的個數

原理:貪心策略。

實現步驟:正向模擬找連線點。即取任意一點,放入集合,找此點集合內最短的邊且邊的另一端點不在該集合內的點,將改點放入點集合內,重複此操作,直至所有點都在該集合內。

備註:因為得首先引入一點,設 0à1

為引入邊,所以為了保持嚴謹性,點都從1àn

,所以注意 0à1

為無效邊。因為該圖是乙個稠密圖,所以在建圖時一般用鄰接矩陣存圖,所以點得極限在10000以內,否則,就該用克魯斯卡爾來求了。

輸入樣例解釋

4  //點的個數

-1 1 4 1  // n*n的鄰接表

1 -1 3 2

4 3 -1 5

1 2 5 -1

輸出樣例解釋

5 //最小生成樹的值

#include#include#include#include#includeusing namespace std;

const int maxn=5100;///點的個數,極限是10000

int n,graph[maxn][maxn];/// 點數、矩陣存圖

int ans,flag[maxn];///標記陣列,對於已在集合內的點標記好

struct node

};void init()///初始化函式

void prim()

temp=pq.top();

pq.pop();

flag[temp.to]=0;///將點賦為 false

ans+=temp.w;

++n;

for(int i=1;i<=n;++i)}}

}int main()

}prim();

printf("%d\n",ans);

}return 0;

}/**

4-1 1 4 1

1 -1 3 2

4 3 -1 5

1 2 5 -1

*/

最小生成樹 prim最小堆(優先佇列)優化演算法

基本prim最小生成樹 1 任意定點構樹 標記陣列標記入樹 2 初始化更新維護dis陣列 3 選出dis中最近的點j加入樹中,並以j為起點鬆弛 4.重複第3步選出n 1個點 堆優化prim最小生成樹 準備 dis陣列,p優先佇列,vis陣列記錄每個定點在最小堆中的位置 1.初始化優先佇列,以定義的起...

最小生成樹 Prim

include stdio.h include stdlib.h include io.h include math.h include time.h define ok 1 define error 0 define true 1 define false 0 define maxedge 20 ...

最小生成樹 prim

演算法模型 由任意乙個頂點開始 將此頂點存入s集,剩餘頂點存入t集合 每次遍歷頂點,取一條能夠連線s與t最短邊e,直到所有頂點全部加入s include include define inf 1 30 int n,m,vis 110 low 110 int map 110 110 int init ...