離散數學 習題篇 最小生成樹

2021-10-01 05:14:34 字數 1517 閱讀 2563

計算帶權無向連通圖g的最小生成樹。

第一行兩個整數:n(1≤n≤300000),表示結點集;表示邊的條數。

接下來m行,每行表示一條帶權的邊,用3個整數u,v,c表示,分別表示一條邊的兩個端點以及其權值(權值範圍0≤c≤109)。

乙個整數,表示g的最小生成樹的邊權之和。

5 10

1 2 3

1 3 7

1 4 9

1 5 5

2 3 6

2 4 8

2 5 4

3 4 9

3 5 7

4 5 2

那麼只看題目的話,應該也能知道這個題是最小生成樹吧

啥是最小生成樹呢?

翻翻課本吧兄弟,直接講實現方式。

首先,給邊排個序。通過權值來排,從小到大。

然後,遍歷這個序列,把這個序列裡沒用過的邊用上,直到所有的點都連起來,就ojbk了。

那麼在用邊的時候,要注意不能出現環,有環的話就不是樹了不是?而這裡,就要用到傳說中的最美麗的資料結構……之一!並查集了。至於並查集是啥,咋用,可以看這篇文章:

資料結構基礎——並查集

(是的我還沒有寫,等寫了就把鏈結貼出來)

#include

using

namespace std;

//雖然叫node但是這個結構體表示的是邊和它的權值

struct node

;//一會排序的時候會用到的函式

bool

cmp(node a, node b)

//存邊的陣列,一會的時候要排序遍歷

vector g;

//實現並查集的東東

vector<

int> f;

//判斷i和j是不是在乙個集合用的陣列

//查詢元素k所在的集合

intfind

(int k)

//把x所在的集合和y所在的集合並起來

intunite

(int x,

int y)

return

false;}

//從這裡看是好習慣哦

intmain

(int argc,

char

const

*ar**)

);}//按照cmp這個函式定義的排序方式排個序

sort

(g.begin()

, g.

end(

), cmp)

;//數有點大,開個long long

long

long sum =0;

//遍歷每個邊,要是加進去成環的話,這個邊是放不進並查集的

for(

auto i : g)

cout << sum;

return0;

}

SDUT 離散數學 4178 最小生成樹

time limit 1000 ms memory limit 65536 kib submit statistic problem description 在乙個無向圖中,求最小生成樹。input 多組測試資料,對於每組測試資料,第1行輸入正整數n 1 n 1000 m,表示n個頂點 編號從1開始...

演算法總結篇 最小生成樹

目錄算是最後幾個完成這一章節學習的了,有很多思想和技巧都很好,需要好好學習 主要涉及兩個演算法 prim 演算法和 kruskal 演算法 感謝lsp為本文訂正做出的貢獻!先跑一遍 dij 求出 d i 再遍歷每個點,統計有幾種修建方案 然後根據乘法原理,求出所有方案數即可 感覺和最小生成樹沒半毛錢...

最小生成樹,回憶複習篇。

最小生成樹,回憶複習篇。以前聽過一遍最小生成樹,可惜,當時沒弄會。過了幾天就全忘了。而如今在做lca的時候,woc我居然不會最小生成樹了。所以來回憶一下最小生成樹。kruskal演算法。這個演算法的主要工具就是,排序,並查集。這裡的排序是一種貪心做法。把邊權最小的邊排在前面,之後開始乙個乙個取。每次...