這段時間在學圖論演算法,刷了一些模板題,也看了一些大牛的**,發現有乙個問題是許多**雖然看起來簡潔卻不好理解,還用了大量的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
log2n
)
#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...