最小生成樹(兩種演算法)

2021-09-12 05:36:07 字數 1120 閱讀 2194

#ifndef min_tree_h

#define min_tree_h

#include#include#include#include#include"../data_struct/data_struct.h"

#include"../tool/tool_disjoint_set.h"

/// 最小生成樹

/// 假設圖中的頂點有n個,則生成樹的邊有n-1條,多一條會存在迴路,少一路則不能把所有頂點聯通起來,

/// 如果非要在圖中加上權重,則生成樹中權重最小的叫做最小生成樹

class graph_min_tree

std::vectoris_visited(graph->vertex.size(), false);

is_visited[0]=true;

for (uint32_t i = 1; i < graph->vertex.size(); i++)

}is_visited[index] = true;

//從最新的節點出發,將此節點的weight比較賦值

for (uint32_t j = 0; j < graph->vertex.size(); j++)}}

//是否能夠生成樹

for (uint32_t i = 1; i < graph->vertex.size(); i++)

}return true;

}/// 克魯斯卡爾:這篇我們看看第二種生成樹的kruskal演算法

/// 我們知道prim演算法構建生成樹是從」頂點」這個角度來思考的,然後採用「貪心思想」

/// 來一步步擴大化,最後形成整體最優解,而kruskal演算法有點意思,它是站在」邊「這個角度在思考的

/// 時間複雜度o(elog2e),適合簡單圖。

static std::vectorkruskal(const std::shared_ptrgraph)}}

//最後收集到的最小生成樹的邊

std::vectorarr;

//迴圈佇列

while (smallpriorityqueue.size() > 0)

}return arr;

}};#endif // min_tree_h

最小生成樹兩種解法

運用了貪心的演算法。是從某個頂點開始不斷新增邊的演算法。int cost max v max v 存邊權 int mincost max v 從集合x出發的邊到每個頂點的最小權值 int book max v int v intprim mincost 0 0 int res 0 while 1 i...

最小生成樹的兩種實現

kruskal演算法的實現 根據最一般的kruskal 演算法的實現原理,本人設計並實現的演算法如下 首先在此演算法中,選邊的過程中,要首先對存在邊按權值按非遞減的順序排列,以順序判斷並加入最小生成樹邊的集合。因此設計資料結構 typedef struct myedge,eptr 在此資料結構中,a...

最小生成樹的兩種演算法及模版整理

圖倫的演算法是我覺得最高大上的,因為每個演算法都有乙個很叼的名字!哈哈,陸續整理一些自己的模版,方便自己以後使用吧。首先是prim演算法的普通版本 複雜度o v 2 include include include using namespace std const int inf 0x3f3f3f3...