計算帶權無向連通圖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演算法。這個演算法的主要工具就是,排序,並查集。這裡的排序是一種貪心做法。把邊權最小的邊排在前面,之後開始乙個乙個取。每次...