填坑行動5 最小生成樹kruskal 學習筆記

2022-07-06 16:06:11 字數 934 閱讀 7906

目錄題目描述

如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz

輸入格式

第一行包含兩個整數\(n,m\)表示該圖共有\(n\)個結點和\(m\)條無向邊。

接下來\(m\)行每行包含三個整數\(x_i,y_i,z_i\) ,表示有一條長度為 \(z_i\)的無向邊連線結點\(x_i,y_i\)x。

輸出格式

如果該圖連通,則輸出乙個整數表示最小生成樹的各邊的長度之和。如果該圖不連通則輸出orz

首先,我們需要知道最小生成樹是什麼。

我們知道數是乙個沒有環的連通圖,要在一張圖裡面找出邊權和最小的一棵樹就是最小生成樹。

這裡我們以kruskal為例來講解演算法。

kruskal首先將每條邊按照邊權從小到大進行排序,這裡通常使用快速排序,就是c++的sort

然後從小到大來逐個判斷這條邊是否在同乙個連通圖內(假設這個圖只有我們我們要加上的邊),如果不是,就加上這條邊。

當然,我們還要使用並查集來維護多個點是否在同乙個連通圖以內。

#include#include#define maxn 200039

using namespace std;

struct edge

}a[maxn];

int f[5039];

int getfa(int x)

int n,m,i,j,k;

int main()

if(getfa(a[i].f)!=getfa(a[i].t))

} printf("orz");

return 0;

}

發現自己變sb了連並查集都快不會打了

Algorithm 最小生成樹之 Kruskal

個人觀點,較prime演算法,kurskal演算法更加的簡單,這裡我們只需要每一次去需找權值最小的那條邊就好,在這裡我們先可以利用sort進行快排,得到權值最小的map i 得到該條邊的兩個節點map i u 和map i v,這時候你需要判斷能不能用這條邊,因為最小生成樹是不能形成迴路,所以用到了...

填坑行動6 樹的重心

目錄對於一棵樹無根樹,找到乙個點,使得把樹變成以該點為根的有根樹時,最大子樹的結點數最小。換句話說,刪除這個點後最大連通塊 一定是樹 的結點數最小。樹的重心不唯一。樹中所有點到某個點的距離和中,到重心的距離和是最小的,如果有兩個重心,他們的距離和一樣。把兩棵樹通過一條邊相連,新的樹的重心在原來兩棵樹...

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...