關於最小生成樹的話,其實很早之前就接觸了,當時也寫了一篇關於最小生成樹的文章,但一直沒有好好刷題。
接下來幾天會持續更新維護kb-最小生成樹專題
最小生成樹的演算法沒有其他演算法那麼複雜,演算法思想比較簡單,**也比較容易。
常見的最小生成樹演算法由kruskal
演算法和prim
演算法。
演算法思想:
建立乙個並查集,每個點構成乙個集合;
將邊進行從小到大進行排序,依次掃瞄邊edge(u,v,w);
如果u和v 屬於同乙個集合,那麼跳過這輪迴圈;
如果不屬於同乙個集合,則把u、v合併為同乙個集合;
當集合中的頂點數為n或者掃遍所有邊edge,則構成最小生成樹。
#include#include#includeusing namespace std;
const int manx=1e5+5; //對應頂點數目
const int mamx=1e5+5; //對應邊的數目
int n,m,u,v,total=1;
struct edgebian[mamx];
int a[manx];
long long ans;
int find(int x) //並查集
bool cmp(edge x,edge y)
e[mamx];
typedef pairp;
priority_queue,greater>q; //堆優化
void add(int u, int v, int w) //鏈式前向星建圖
int main()
dis[1]=0; //一般將1作為最小生成樹擴充套件的起點
q.push(make_pair(0,1));
while(!q.empty() && cnt儘管堆優化,但不如直接使用kruskal演算法更加方便,因此,稀疏圖用kruskal,稠密圖用prim 。
最小生成樹Kruskal演算法模板
利用陣列fa來記錄各個節點的父節點,初始化為自己 通過sort排序,從邊長最短到最長 for 邊長 判斷 如果邊的兩個端點的父節點不相同,可選 把選過的邊的兩端點中,大序號的父節點處理為小序號的父節點 include include using namespace std define n 28 i...
最小生成樹 Prim演算法(模板)
基本演算法 首先以乙個結點作為最小生成樹的初始結點,然後以迭代的方式找出與最小生成樹中各結點權重最小邊,並加入到最小生成樹中。選擇一條權值最小,且一端點a已加入生成樹,另一端點b在剩餘結點集內的邊作為最小生成樹上的邊,同時將b列入生成樹的已有點集中。當所有結點都加入到最小生成樹中之後,就找出了連通圖...
模板 最小生成樹 kruskal演算法
題目描述 如題,給出乙個無向圖,求出最小生成樹 輸入輸出格式 輸入格式 第一行包含兩個整數n m,表示該圖共有n個結點和m條無向邊。n 5000,m 200000 接下來m行每行包含三個整數xi yi zi,表示有一條長度為zi的無向邊連線結點xi yi 輸出格式 輸出包含乙個數,即最小生成樹的各邊...