圖的生成樹是一棵含有其所有節點的無環聯通子圖, 加權圖的最小生成樹(mst) 是一棵權值和最小的生成樹.
題目對應 leetcode 1135. 最低成本聯通所有城市, 題目如下:
想象一下你是個城市基建規劃者,地圖上有n
座城市,它們按以1
到n
的次序編號。
給你一些可連線的選項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演算法 以點為展開,將圖中...