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演算法,第二種演算法稱...