最小生成樹是在一張無向連通圖中,找到一棵樹,使得其邊的代價之和最小。
注:可能存在多個最小生成樹。
以邊為展開,將圖中的最小代價邊嘗試加入集合tree中,並且該邊不能與集合tree中的邊形成環,如此迭代,最終得到的集合tree為mst。因此可以採用並集查的方式實現kruskal演算法
以點為展開,將圖中的最小代價邊的終點嘗試加入集合visited中,並邊的起點from已在集合visited中,終點to不在集合visited中。這裡,可以採用堆來儲存擴充套件的邊。
#include
#include
#include
#include
#include
#include
using
namespace std;
class
mst}
;int
findparent
(int x, vector<
int>
& parents)
void
merge
(int x,
int y, vector<
int>
& parents)
public:/*
kruskal
input
edges: [[u, v, w], ...] undirected connected graph
n: the number of points
mincost: the minimum cost
output
the one of mst
*/ vectorint>>
findmst_kruskal
(vectorint>> edges,
int n,
int& mincost));
vector<
int>
parents
(n);
for(
int i =
0; i < n;
++i)
parents[i]
= i;
vectorint>>tree;
mincost =0;
for(
auto
& edge : edges)
return tree;}/*
prim
input
edges: [[u, v, w], ...] undirected connected graph
n: the number of points
mincost: the minimum cost
output
the one of mst
*/ vectorint>>
findmst_prim
(vectorint>> edges,
int n,
int& mincost)
priority_queueint>
, vectorint>>
, cmp>queue;
unordered_set<
int>visited;
vectorint>>tree;
mincost =0;
int from =0;
visited.
insert
(from)
;while
(true)if
(queue.
empty()
)break
;auto edge = queue.
top();
queue.
pop();
if(visited.
find
(edge[1]
)!= visited.
end())
continue
; mincost +
= edge[2]
; visited.
insert
(edge[1]
);tree.
push_back
(edge)
; from = edge[1]
;}return tree;}}
;int
main()
,,,,
,};int n =4;
mst mst;
int mincost =0;
auto tree=mst.
findmst_prim
(edges, n, mincost)
; cout <<
"mincost"
<< mincost << endl;
for(
auto
& edge : tree)
cout << edge[0]
<<
" "<< edge[1]
<<
" "<< edge[2]
<< endl;
}
最小生成樹(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
description 生成樹 乙個有n個結點的連通圖的生成樹是原圖的極小連通子圖,包含原圖中的所有n個結點,並且有保持圖連通的最少的邊。最小生成樹 生成樹中權值最小的一種方案。給定乙個無向圖,請輸出最小生成熟的權值。存在重邊 input 第一行包含三個整數n m,分別表示點的個數 邊的個數 接下來...