最小生成樹演算法 Kruskal演算法

2021-09-20 18:51:38 字數 713 閱讀 1366

在最小生成樹的問題中,我們常常不必把生成樹表示出來,一般是計算生成樹權值之和等問題

kruskal演算法就是把所有邊排序一下,從小到大將邊放到生成樹當中,但是要滿足將邊放入後不形成環的條件。

兩個要點:

1.要先將所有的邊進行排序

2.利用並查集來快速判斷兩個點是否在同一顆樹當中,如果在的話,邊放入必然會產生環

利用kruskal演算法計算最小生成樹的權值總和

注意:這個問題我們不需要把圖建立出來

#include #include using namespace std;

int parent[1005]; //並查集的實現陣列,開的大小為點的個數

int find(int p)

struct node

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

sort(p,p+m); //將邊進行排序

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

if( n==1 ) break; //如果只剩下一顆樹了,break出去

} cout << ans << endl;

return 0;

}

時間開銷主要在對邊的排序上,所以時間複雜度為elog(e),e為圖的邊數

最小生成樹 Prim演算法和Kruskal演算法

最小生成樹 3條構造最小生成樹的準則 只能使用該網路中的邊來構造最小生成樹 只能使用恰好n 1條邊來聯結網路中的n個結點 選用的這個n 1條邊不能構成迴路。mst性質 假設n v,是乙個連通網,u是頂點集合v的乙個非空子集。若 u,v 是一條具有最小值 代價 的邊,其中u屬於u,v屬於v u 即u對...

最小生成樹 Prim演算法和Kruskal演算法

轉於 prim演算法 設圖g v,e 其生成樹的頂點集合為u。把v0放入u。在所有u u,v v u的邊 u,v e中找一條最小權值的邊,加入生成樹。把 找到的邊的v加入u集合。如果u集合已有n個元素,則結束,否則繼續執行 其演算法的時間複雜度為o n 2 define maxn boolflag ...

最小生成樹 Prim演算法和Kruskal演算法

prim演算法 演算法簡單描述 1 輸入 乙個加權連通圖,其中頂點集合為v,邊集合為e 2 初始化 vnew 其中x為集合v中的任一節點 起始點 enew 為空 3 重複下列操作,直到vnew v a.在集合e中選取權值最小的邊,其中u為集合vnew中的元素,而v不在vnew集合當中,並且v v 如...