kruskal演算法入門

2021-08-07 14:57:49 字數 1445 閱讀 6449

【簡介】克魯斯卡爾演算法是一種用來尋找最小生成樹的演算法。在剩下的所有未選取的邊中,找最小邊,如果和已選取的邊構成迴路,則放棄,選取次小邊。即給定一些線段的x,y和權值,當x,y不在乙個集合的時候,選取權值最小的乙個邊,然後把x,y合併到乙個集合中(並查集維護)

我們用現在來模擬一下kruskal演算法,下面給出乙個無向圖b,我們使用kruskal來找無向圖b的最小生成樹。

首先,我們將所有的邊都進行從小到大的排序。排序之後根據貪心準則,我們選取最小邊(a,d)。我們發現頂點a,d不在一棵樹上,所以合併頂點a,d所在的樹,並將邊(a,d)加入邊集e。

我們接著在剩下的邊中查詢權值最小的邊,於是我們找到的(c,e)。我們可以發現,頂點c,e仍然不在一棵樹上,所以我們合併頂點c,e所在的樹,並將邊(c,e)加入邊集e

不斷重複上述的過程,於是我們就找到了無向圖b的最小生成樹,如下圖所示!

核心**:

初始化並查集

for (int i=1;i<=n;i++) fat[i]=i;//初始化並查集
並查集中的查詢和合併操作

int ask(int x)

void unite (int x,int y)

另外,使用結構體儲存邊的x,y座標和權值。

模板題:p3366 【模板】最小生成樹

**如下:

#include

#include

#define n (5010)

#define m (200010)

using

namespace

std;

//定義結構體存邊,x為起點,y為終點,z為值

struct edgea[m];

int fat[n],tot,ans;

bool cmp(edge x,edge y)

void unite (int x,int y)

int main()

}if (tot1) printf("orz");//判斷若tot=k-1則生成了最小樹

else

printf("%d",ans);

return

0;}

注意,判斷若tot=k-1則生成了最小樹。

Prim演算法 Kruskal演算法

一 prim演算法 1 要求 1 生成一顆連通的樹 2 生成樹 包含全部頂點,v 1條邊,沒有迴路,並且新增一條邊會變成有迴路 3 權重和最小 2 過程模擬 最重要 貪心的思想,每一步都要選擇權值最小的,這棵樹所有跟頂點相連的邊中最小的。從根節點開始,讓樹慢慢的長大。過程 從v1開始 跟v1有聯絡的...

Prim演算法 Kruskal演算法

prim演算法 kruskal演算法 prim演算法和kruskal演算法,都是用來找出圖中最小生成樹的演算法,兩個演算法有些小差別。prim演算法 又稱普里姆演算法,以圖上的頂點為出發點,逐次選擇到最小生成樹頂點集距離最短的頂點為最小生成樹的頂點,並加入到該頂點集,直到包含所有的頂點。1.選擇一出...

Kruskal演算法 Prim演算法

最小生成樹是什麼?自a2392008643的部落格 此演算法可以稱為 加邊法 初始最小生成樹邊數為0,每迭代一次就選擇一條滿足條件的最小代價邊,加入到最小生成樹的邊集合裡。把圖中的所有邊按代價從小到大排序 把圖中的n個頂點看成獨立的n棵樹組成的森林 按權值從小到 擇邊,所選的邊連線的兩個頂點ui,v...