最小生成樹 kruskal 並查集

2021-10-04 01:38:01 字數 1401 閱讀 7712

題目描述

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

輸入輸出格式

輸入格式:

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

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

輸出格式:

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

輸入輸出樣例

輸入樣例#1:

4 51 2 2

1 3 2

1 4 3

2 3 4

3 4 3

輸出樣例#1:

7

這段**其實出現了一點小錯誤,但我實在不知道錯在哪。。。

好吧,我後來修改了merge的**,算是寫對了

#include

#include

#include

using namespace std;

//最小生成樹之kruskal 也就是使用並查集

//第乙個是判斷 邊是否在同乙個子集之中 第二個就是判斷 邊之間的合併

int a[

100]=;

////再建立乙個結構體陣列來儲存 起點,終點 和邊的長度

struct jjj[

100]

;//寫乙個判斷祖宗的方法

intzuzong

(int x)

//寫乙個判斷的方法

bool check

(int x,

int y)

//再寫乙個合併的方法

void

merge_1

(int x,

int y)

//再寫乙個比較的方法,用邊的長度作為比較物件

bool cmp

(jj x,jj y)

intmain()

//然後按照思想,先對邊進行從小到大排序,然後使用並查集對邊的頂點進行判斷是否在同乙個集合中

sort

(j,j+m,cmp)

;//對幾個結點的祖宗賦初值,都是等於自己

for(i=

1;i<=n;i++

) a[i]

=i;//然後開始判斷

for(i=

0;i//最後輸出

if(co==n-1)

printf

("%d"

,sum)

;else

printf

("orz");

}

並查集與kruskal最小生成樹

1 概述 並查集 disjoint set或者union find set 是一種樹型的資料結構,常用於處理一些不相交集合 disjoint sets 的合併及查詢問題。a.乙個集合是一棵樹,b.根節點下標代表集合名稱,根節點的父為為負數,絕對值表示集合中的元素個數。並查集的重要知識點 a.加權規則...

Kruskal演算法(貪心 並查集 最小生成樹)

kruskal演算法 克魯斯卡爾 演算法 的高效實現需要一種稱作並查集的結構。我們在這裡不介紹並查集,只介紹kruskal演算法的基本思想和證明,實現留在以後討論。kruskal演算法的過程 1 將全部邊按照權值由小到大排序。2 按順序 邊權由小到大的順序 考慮每條邊,只要這條邊和我們已經選擇的邊不...

Kruskal演算法(貪心 並查集 最小生成樹)

2016年04月16日 17 34 35 kruskal演算法的高效實現需要一種稱作並查集的結構。我們在這裡不介紹並查集,只介紹kruskal演算法的基本思想和證明,實現留在以後討論。kruskal演算法的過程 1 將全部邊按照權值由小到大排序。2 按順序 邊權由小到大的順序 考慮每條邊,只要這條邊...