洛谷 P3366 模板 最小生成樹

2022-02-13 14:04:20 字數 1589 閱讀 8749

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

輸入格式:

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

接下來m行每行包含三個整數xi、yi、zi,表示有一條長度為zi的無向邊連線結點xi、yi

輸出格式:

輸出包含乙個數,即最小生成樹的各邊的長度之和;如果該圖不連通則輸出orz

輸入樣例:

4 5

1 2 2

1 3 2

1 4 3

2 3 4

3 4 3

輸出樣例:

7
時空限制:1000ms,128m

資料規模:

對於20%的資料:n<=5,m<=20

對於40%的資料:n<=50,m<=2500

對於70%的資料:n<=500,m<=10000

對於100%的資料:n<=5000,m<=200000

樣例解釋:

所以最小生成樹的總邊權為2+2+3=7

很顯然這是求乙個圖的最小生成樹,有關最小生成樹的基礎知識不懂的請看我的另一篇部落格:

在這裡,我們講的是kruskal演算法

首先,將每一條邊存入結構體中,然後將邊按照權值從小到大排序,然後依次列舉每一條邊,若連線的兩個端點不連通則加入最小生成樹中。這樣就保證了先加入的邊一定是權值最小的邊。

我們要用到並查集來維護。用並查集來判斷每一條邊連的兩個端點是否聯通,如果不是,就將這兩個集合合併起來,這樣就快速地構建了最小生成樹。

這個題還有乙個點就是判斷圖是否聯通,在這裡只需要判斷最後的最小生成樹中是否只有n-1條邊即可。因為n個點的樹有n-1條邊。資料太水,不用判斷也能ac!

下面附上**。

1 #include2 #include//

sort的標頭檔案

3using

namespace

std;

4struct edgebian[200005

]; 9

int n,m,cnt,ans,fa[5005];//

cnt記錄共有幾條邊,ans為最小生成樹的邊權和

10bool cmp(edge a,edge b)

13int find(int x)

17int

main()

1824 sort(bian+1,bian+m+1,cmp); //

有小到大排序

25for(int i=1;i<=m;i++)35}

36if(cnt!=n-1)

40 cout<

41return0;

42 }

ac**

洛谷 P3366 模板 最小生成樹

題目描述 如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz 輸入輸出格式 輸入格式 第一行包含兩個整數n m,表示該圖共有n個結點和m條無向邊。n 5000,m 200000 接下來m行每行包含三個整數xi yi zi,表示有一條長度為zi的無向邊連線結點xi yi 輸出格式 輸出...

洛谷 P3366 模板 最小生成樹

題目描述 如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz輸入格式 第一行包含兩個整數n m,表示該圖共有n個結點和m條無向邊。n 5000,m 200000 接下來m行每行包含三個整數xi yi zi,表示有一條長度為zi的無向邊連線結點xi yi輸出格式 輸出包含乙個數,即最小...

洛谷 P3366 模板 最小生成樹

題目描述 如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz 輸入輸出格式 輸入格式 第一行包含兩個整數n m,表示該圖共有n個結點和m條無向邊。n 5000,m 200000 接下來m行每行包含三個整數xi yi zi,表示有一條長度為zi的無向邊連線結點xi yi 輸出格式 輸出...