目錄題目描述
如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出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的生成樹,而各邊權和最小的生成樹則被稱...