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

2022-06-03 08:30:13 字數 812 閱讀 8400

: 連通且不含環的圖

生成樹:給定無向圖g=(v,e),連線g中所有點,且邊集是e的子集的樹

最小生成樹(mst):權值最小的生成樹①將所有邊按從小到大排列

②依次考察每條邊\((u,v)\)。若\(u\)和\(v\)在同乙個連通分量中,加入\((u,v)\)會成環,因此不能選擇;否則,加入\((u,v)\)一定是最優的(假設不加入這條邊能得最優解t,則\(t+(u,v)\)一定有且只有乙個環,且這個環中至少有一條邊\((u',v')\)的權值\(≥(u,v)\))

關於連通分量的判斷與合併,使用並查集。

並查集將每個連通分量看成乙個包含該分量中所有點的集合,這些點之間兩兩連通(強連通?),只需要選其中乙個點作為集合的代表即可(也就是縮點)。

//並查集

//p[x]儲存結點x的祖先

int find(int x)

//最小生成樹kruskal演算法

int u[maxn], v[maxn];//第i條邊的兩個端點的序號

int w[maxn];//第i條邊的權值

int cmp(const int i, const int j)

int find(int x)

int kruskal() ,排序後r陣列儲存的是

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

} return ans;

}

最小生成樹 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 如...