最小生成樹 Kruskal演算法

2022-03-09 11:32:13 字數 1074 閱讀 2389

連通無迴路的無向圖稱之為樹,如果無向圖g的生成子圖t是樹,則稱t是g的生成樹,生成樹不止一種,其中各邊權值和最小的樹被稱為最小生成樹。

其中(1)為原無向圖,(2)為其中一種生成樹,(3)為其中一種最小生成樹。

kruskal演算法也是一種貪心的演算法,去除n階無向圖中所有的邊,然後每次挑選所有邊中權值最小的那一條邊相連,如果連邊會導致圖形成環,就拋棄這條邊,去尋找下一條邊,直到圖上存在n-1條邊位置,即可得到最小生成樹。

其選邊過程為:

所以演算法實現先對所有邊按照權值進行排序,在以貪心思想接連構成邊。採取避環的思想,直到得到一顆最小生成樹。

其中實現的難點在於如何判斷構成了環,首先利用搜素的思想遍歷當然是可行的,但是時間複雜度較高。所以這時候就能用上之前提到過的並查集,當處於同乙個集合的時候便可以判斷二者之間有通路,若在鏈結便會構成環。

給出之前並查集的傳送門:(

時間複雜度為o(mlogm)

#include#include#include#includeusing namespace std;

const int max = 200005;

int pre[50050], ran[50050], ans = 0;

struct edge e[max];

bool cmp(edge a, edge b)

void make_pre(int i)

int find_pre(int i)

int unite(int x, int y, int w)

else

ans += w;

return 1;

}int main()

sort(e + 1, e + m + 1, cmp);

ans = 0;

int count = 0;

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

cout << ans << endl;

return 0;

}

最小生成樹 kruskal(演算法)

最小生成樹 圖中有好多點呀 n個 讓我們找到n 1條邊,來把他們連上吧,但是要讓這n 1條邊的和最小。kruskal演算法 把所有邊由公升序排列,然後從最小的一條邊找起,如果這條邊的兩點不屬於乙個集合 此處運用並查集 那麼就要這條邊,否則,忽略這條邊吧 一直這樣找下去,直到找了n 1條邊為止,此時,...

最小生成樹 Kruskal演算法

1.概覽 kruskal演算法是一種用來尋找最小生成樹的演算法,由joseph kruskal在1956年發表。用來解決同樣問題的還有prim演算法和boruvka演算法等。三種演算法都是貪婪演算法的應用。和boruvka演算法不同的地方是,kruskal演算法在圖中存在相同權值的邊時也有效。2.演...

最小生成樹 kruskal演算法

2016.12.30 演算法思想 先將邊按照權值排序,從權值最小的邊開始列舉,如果當前邊連線的兩個點不屬於同一集合,就將這兩個點連起來 用到的資料結構是並查集 一直到列舉完所有的邊,此時生成的就是最小生成樹 include include include include using namespac...