適合入門選手使用的prim最小生成樹演算法

2021-08-13 06:46:18 字數 1247 閱讀 9713

這段時間在學圖論演算法,刷了一些模板題,也看了一些大牛的**,發現有乙個問題是許多**雖然看起來簡潔卻不好理解,還用了大量的stl內容。因此,我將乙個較好理解的**放上來,希望能幫到大家。

該**的演算法跟標準的演算法區別不大,只是較好理解,建議先看完其他地方的演算法描述再看下面的**實現

時間複雜度o(

n2) o(n

2)

#include

#include

#define maxn 5005

#define inf 99999999

int n,m;

long

long ans;

int g[maxn][maxn];//鄰接矩陣存圖

int key[maxn];//key[v]表示藍點v與白點相連的最小邊權

int used[maxn];//表示是藍點還是白點

using

namespace

std;

long

long prim()

int main()

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

}ans=prim();

if(ans>=10000000)cout

<<"orz"

else

cout

0;}

另外,該演算法還可以通過堆優化將時間複雜度降為o(

nlog2n

) o(n

log2⁡n

)

#include

#include

#include

#define maxn 5005

#define maxm 2*200000+5

using namespace std;

int n,m;

int head[maxn];

int key[maxn],used[maxn];

struct edge_tableedge[maxm];

int edge_cnt=0;

struct heap_node

};void add_edge(int u,int v,int w)

int prim() }}

if(tot1;

return ans;

}int main()

int ans=prim();

if(ans==-1) cout<<"orz"

}

使用prim演算法構造最小生成樹

對於乙個無向連通圖,若是稠密圖的話 儲存 鄰接矩陣g n n 來儲存圖,n為圖最大的點的數量 dist n 儲存集合外的點到集合的最短距離,s n 即集合s,儲存集合的點,若s i true,則該點在集合,否則不在。演算法 設乙個s集合 圖的點的集合 初始時集合沒有點 步驟 1 從所有點中找距離s集...

最小生成樹的prim演算法

在無向加權圖中,n個頂點的最小生成樹有n 1條邊,這些邊使得n個頂點之間可達,且總的代價最小。prim演算法是一種貪心演算法,將全部的頂點劃分為2個集合,每次總在2個集合之間中找最小的一條邊,區域性最優最終達到全域性最優,這正是貪心的思想。具體的描述參見相關書籍 描述 從單一頂點開始,普里姆演算法按...

最小生成樹的Prim演算法

最小生成樹的prim演算法 最小生成樹的一些性質 如果有n個節點,只需要n 1條邊就可以連通。最小生成樹就是從n n 1 2條邊中找到最小代價的n 1條邊 1,利用了mst的性質 假如n v,是乙個連通網,u是頂點集v的乙個非空的子集。若 u,v 是一條具有最小權值 代價 的邊,其中u是u的元素,v...