最小生成樹prim演算法(模板)

2021-08-28 03:30:57 字數 1916 閱讀 4116

prim演算法適合稠密圖,即邊數較多而點較少的情況,時間複雜度為o(

n2) o(n

2)

,堆優化的情況下,如果點數為m,邊數為n,可以達到o(

nlog

m)o (n

logm

).思想很簡單,就是每次尋找一條由已加入集合的點和與它們相鄰的沒加入集合的點的權值最小邊,進行n-1次就找出來了,也是貪心的思想,實現就是隨便找乙個初始節點,然後建乙個最小堆(邊小的先pop出來),把該節點的vis值置為1,遍歷該節點相鄰的節點,如果沒有被vis標記過,就加入邊到堆中,掃完了以後處理堆中資料,如果彈出的邊被標記過就pop,沒有就取出來,把邊通往的節點置為key,下次就加入key節點有關沒有標記過的邊。迴圈n-1次,把每一次堆彈出邊的值累加起來就是最小生成樹的值了

#include

using

namespace

std;

const

int maxn=1005;

struct edge

bool

operator

<(const edge& e)const

};int n,m;

bool vis[maxn];

vector

g[maxn];

priority_queueque;

void prim()

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

}int main()

prim();

}return

0;}

#include

using

namespace

std;

const

int maxn=1005;

struct edge

};struct heapnode

bool

operator

<(const heapnode& rhs)const

};int n,m;

bool done[maxn];

vector

edges;

vector

g[maxn];

void init()

int prim(int s)

ans+=x.d;

done[x.u]=true;

for(int i=0;iif(!done[e.to]) que.push(heapnode(e.dist,e.to));}}

return ans;

}int main()

printf("%d\n",prim(0));

}return

0;}

#include

using

namespace

std;

const

int maxn=1005;

struct heapnode

bool

operator

<(const heapnode& e)const

};int n,m;

int g[maxn][maxn];

bool done[maxn];

int prim(int s)

int ans=0;

for(int cnt=1;cntwhile(que.size())

ans+=x.d;

done[x.u]=true;

for(int i=0;iif(g[x.u][i]!=-1 && !done[i]) que.push(heapnode(g[x.u][i],i));}}

return ans;

}int main()

printf("%d\n",prim(0));

}return

0;}

最小生成樹 Prim演算法(模板)

基本演算法 首先以乙個結點作為最小生成樹的初始結點,然後以迭代的方式找出與最小生成樹中各結點權重最小邊,並加入到最小生成樹中。選擇一條權值最小,且一端點a已加入生成樹,另一端點b在剩餘結點集內的邊作為最小生成樹上的邊,同時將b列入生成樹的已有點集中。當所有結點都加入到最小生成樹中之後,就找出了連通圖...

最小生成樹prim演算法模板

include using namespace std const int inf 0x3f3f3f3f 最大值,方便計算 int n,m n是點的個數,m是邊的數量 int dis 105 vis 105 dis是判斷未加入生成樹的頂點到已知生成樹的最短距離,vis判斷是否已經加入生成樹 int ...

模板) 最小生成樹Prim演算法

演算法跟dijkstra很像 但是要特別注意兩點 1.最好使用乙個額外的陣列來保證每個點只被訪問一次,否則的話應該保證在35行處使用e.dis dis e.num 而不僅是 否則會造成一些相等的額外相加。2.40行的地方要注意與dijkstra的區別!不是加而是直接換!include include...