最小生成樹基礎演算法

2021-10-10 07:46:25 字數 1902 閱讀 9472

prim演算法求最小生成樹

與dijkstra演算法類似,dijkstra演算法是計算乙個節點到其他節點的最短路,prim演算法是需要維護節點到乙個集合的距離最小值,優化方式也是類似的,只需要用堆來維護距離即可

#include

using

namespace std;

const

int n =

510, inf =

0x3f3f3f3f

;int n, m;

int g[n]

[n];

//鄰接矩陣存圖

int dist[n]

;//距離陣列

bool st[n]

;//判斷當前點是否被用到

intprim()

if(i && dist[t]

== inf)

//表示第一次用到的這個點與集合不連通,即沒有最小生成樹

return inf;

if(i)

//如果不是第一次的話,將距離疊加,只有乙個點沒有最小生成樹的概念

res +

= dist[t]

;for

(int j =

1; j <= n; j++

)//用這個點的距離更新這個點到集合的距離

dist[j]

=min

(dist[j]

, g[t]

[j])

; st[t]

=true;}

return res;

}int

main()

int t =

prim()

;if(t == inf)

//當所有點不連通的時候,不存在最小生成樹

cout <<

"impossible"

<< endl;

else

cout << t << endl;

return0;

}

kruskal演算法求最小生成樹

將圖中的邊按權重排序,遍歷每一條邊,如果兩條邊不連通,就連在一起

這裡使用了並查集維護每一條邊

#include

using

namespace std;

const

int n =

200010

;int n, m;

int p[n]

;//用並查集,維護邊的權重,降低時間複雜度

struct edge

} edges[n]

;int

find

(int x)

//並查集中找祖宗節點+優化的函式

intmain()

;}sort

(edges, edges + m)

;for

(int i =

1; i <= n; i++

)//初始化並查集

p[i]

= i;

int res =0;

//儲存最小生成樹中所有邊的權重之和

int cnt =0;

//儲存當前一共加了多少條邊

for(

int i =

0; i < m; i++)}

if(cnt < n -1)

//表示存在不連通的點,即不存在最小生成樹

cout <<

"impossible"

<< endl;

else

//輸出答案

cout << res << endl;

return0;

}

最小生成樹基礎

0.1 本文總結於 資料結構與演算法分析,源 均為原創,旨在 review 最小生成樹的基礎知識 0.2 了解本文的內容是 分析prim演算法 普利姆演算法 和 kruskal演算法 克魯斯卡爾演算法 的前提 1.1 我們考慮的問題 在乙個無向圖中找出一顆最小生成樹。乙個無向圖g的最小生成樹就是由該...

最小生成樹基礎

基礎分析20180325ls 前置演算法 鄰接表的使用,排序,並查集,圖的遍歷 概念 一張圖中,給出n個點,m條邊,每條邊有權值,求 用最少的邊權使全圖聯通。概念分析 其實概念中的最小,包含了2個方面 1 是邊的數量最小 乙個圖要完全聯通,只需要 n 1 條邊,這樣又不會成環,所以就是樹 2 要求邊...

最小生成樹演算法

由帶權的連通圖生成的數的各邊加起來稱為生成樹的權,把權值最小的生成樹稱為最小生成樹 minimum spanning tree 簡稱為mst 構造最小生成樹的方法就是利用mst性質,一條一條地選擇可以加入的邊。下面介紹兩種用於構造最小生成樹的演算法,其中第一種演算法稱為prim演算法,第二種演算法稱...