MST 最小生成樹)

2022-10-11 02:33:15 字數 1057 閱讀 9479

一、什麼是圖的最小生成樹(mst)

二、最小生成樹用來解決什麼問題?

三、prim演算法

演算法描述:(時間複雜度n的2次方(鄰接矩陣),鄰接表o(e log(n))其中e為邊數)

以1為起點生成最小生成樹,min[v]表示藍點v與白點相連的最小邊權,mst表示最小生成樹的權值之和

a)初始化:min[v]= ∞(v≠1); min[1]=0;mst=0;

b)for (i = 1; i<= n; i++)

1.尋找min[u]最小的藍點u。

2.將u標記為白點

3.mst+=min[u]

4.for 與白點u相連的所有藍點v

if (w[u][v]q;

for(int i=1;i<=n;++i)d[i]=0x3f3f3f3f;

q.push((node));

d[st]=0;

int ans=0;

while(!q.empty()));}}

} }return ans;

}

反證法

假設權值最小的邊不在最小生成樹中。

此時將權值最小的邊加入生成樹中,那麼必然會構成一 個迴路(最小生成樹有n個點,最小邊加入之後會有n條邊),任意去掉環裡比權值最小的邊權值大的一條邊,這樣就構造了更優的乙個解,這時與假設構成矛盾。所以權值最小的邊一定在最小生成樹中。

四、kruskal

kruskal演算法分e 步,其中e 是網路中邊的數目。按耗費遞增的順序來考慮這e 條邊,每次考慮一條邊。當考慮某條邊時,若將其加入到已選邊的集合中會出現環路,則將其拋棄,否則,將它選入。

用並查集維護在同一棵樹上的點,如果邊上的兩點已經在一棵樹上,加邊後一定會有環。

kruskal演算法在連邊的時候實際上是把兩個連通塊相連,如果圖本身連通則執行完之後應該只有乙個連通塊

int liantongkuai=n;//乙個點就是乙個連通塊

int kruscal()

} return ans;

}

最小生成樹(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演算法 以點為展開,將圖中...