最小生成樹MST

2021-10-09 02:50:52 字數 2491 閱讀 5536

最小生成樹是在一張無向連通圖中,找到一棵樹,使得其邊的代價之和最小。

注:可能存在多個最小生成樹。

以邊為展開,將圖中的最小代價邊嘗試加入集合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,分別表示點的個數 邊的個數 接下來...