#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...