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