生活随笔
收集整理的這篇文章主要介紹了
最小生成树(MST)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最小生成樹
包含所有N個節點,N-1條邊沒有環權值之和最小
下圖表示一最小生成樹,原圖于其后面。
MST=6
原圖
Prim算法
是一種貪心算法,從一個節點出發,找最小邊的節點加入。
#include <iostream>
#include<vector>
#include<queue>
using namespace std
;int main()
{std
::cout
<< "Hello World!\n"; const int n
= 4;vector
<vector
<int> > edges
= {{0,1,1},{0,3,3},{0,2,6},{1,3,5},{1,2,4},{2,3,2}};vector
<vector
<pair
<int, int> > > g(n
);for (const auto& e
: edges
) {g
[e
[0]].emplace_back(e
[1], e
[2]);g
[e
[1]].emplace_back(e
[0], e
[2]); }vector
<vector
<pair
<int, int> > >::iterator iter
;for (iter
= g
.begin(); iter
!= g
.end(); iter
++) {cout
<< "層" << endl
;vector
<pair
<int, int> > temp
= *iter
;vector
<pair
<int, int> >::iterator it
;for (it
= temp
.begin(); it
!= temp
.end(); it
++) {cout
<< (*it
).first
<< " " << (*it
).second
<< endl
;}}priority_queue
<pair
<int, int> > q
;vector
<int> seen(n
);q
.emplace(0, 0);int cost
= 0;for (int i
= 0; i
< n
; ++i
) {const int w
= -q
.top().first
;const int v
= q
.top().second
;q
.pop();if (seen
[v
]++) continue;cost
+= w
;for (const auto& p
: g
[v
]) {if (seen
[p
.first
]) continue;q
.emplace(-p
.second
, p
.first
);}}cout
<< cost
<< endl
;}
總結
以上是生活随笔為你收集整理的最小生成树(MST)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。