最小生成樹 MST 和 kruskal 演算法

2021-10-07 18:15:05 字數 1149 閱讀 3763

圖的生成樹是一棵含有其所有節點的無環聯通子圖, 加權圖的最小生成樹(mst) 是一棵權值和最小的生成樹.

題目對應 leetcode 1135. 最低成本聯通所有城市, 題目如下:

想象一下你是個城市基建規劃者,地圖上有n座城市,它們按以1n的次序編號。

給你一些可連線的選項conections,其中每個選項conections[i] = [city1, city2, cost]表示將城市city1和城市city2連線所要的成本。(連線是雙向的,也就是說城市city1和城市city2相連也同樣意味著城市city2和城市city1相連)。

返回使得每對城市間都存在將它們連線在一起的連通路徑(可能長度為 1 的)最小成本。該最小成本應該是所用全部連線代價的綜合。如果根據已知條件無法完成該項

kruskal 演算法過程如下:

按照邊的權值有效到大排序

使用並查集, 在不構成環的情況下把邊的兩個頂點加入並查集, 並記錄當前權值, 如果構成環,捨棄掉改邊.

當並查集中邊的數量為n-1時返回結果. 當所有邊都遍歷結束但數量不滿足n-1時,返回-1

**如下:

bool

cmp(vector<

int>

&a, vector<

int>

&b)class

dsuint

find

(int x)

return parent[x];}

void

_union

(int x,

int y)

}bool

iscircle

(int x,

int y)};

class

solution

if(cnt == n -1)

break;}

return cnt == n -

1? ret:-1

;}};

最小生成樹(MST)

在帶權圖中,所有的生成樹中邊權的和最小的那棵 或幾棵 被稱為最小生成樹。幾點注意 求最小生成樹使用kruskal演算法。使用並查集處理節點的集合屬性,初始時所有結點屬於只包含其自身的孤立集合。實現 include include using namespace std define n 101 in...

最小生成樹 MST

1 prim演算法 對點進行貪心操作。適合稠密圖 const int m 1005 int vis m 表示該i點是否被選擇 vis i 0 還未被選擇 int map m m map i j 表示i到j的距離 int dis m 1到i的距離和 void prim cout sum 2 krusk...

最小生成樹MST

最小生成樹是在一張無向連通圖中,找到一棵樹,使得其邊的代價之和最小。注 可能存在多個最小生成樹。以邊為展開,將圖中的最小代價邊嘗試加入集合tree中,並且該邊不能與集合tree中的邊形成環,如此迭代,最終得到的集合tree為mst。因此可以採用並集查的方式實現kruskal演算法 以點為展開,將圖中...