最小生成樹(Prim)

2021-09-12 15:10:59 字數 882 閱讀 4944

#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

const int maxn =55;//節點數目

const int inf = 0x3f3f3f3f;

int len[maxn];//已訪問節點集合到其他點的最短距離

int mp[maxn][maxn];//所有點之間的距離

int vis[maxn];//訪問節點標記

int main()

memset(len, 0x3f, sizeof(len));//初始化乙個較大的值

for(i = 0;i < n;++i)

len[i] = mp[a][i];//隨便選擇乙個點開始

memset(vis, 0, sizeof(vis));//初始化未訪問

vis[a] = 1;

int v, mi;

//每次都 vis 乙個點,加上上面一次 vis, 所以一共 vis n次

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

{//選出當前離 集合s 最近的點

mi = inf;

for(j = 0;j 但有時候會因為輸入的資料量過大而導致超時或者爆記憶體,所以不能暴力的用mp[maxn][maxn],用vector儲存見另一篇部落格。當使用vector還不足以ac,那就乾脆考慮換成kruskal吧。

注:若頂點數為n,邊為e

prim演算法適合稠密圖,其時間複雜度為o(n^2),其時間複雜度與邊的數目無關,

而kruskal演算法的時間複雜度為o(eloge)跟邊的數目有關,適合稀疏圖。

最小生成樹 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 ...

最小生成樹 PRIM

這個是有關普利姆的演算法,從乙個點出發,找出與這個點相連的所有點的對應的權值最小的那個,然後再把這個點從集合中劃掉。模板如下 include include define inf 0xfffff define max 2005 using namespace std int map max max ...