摘要:最小生成樹(shù)有兩種生成算法普里姆算法克魯斯克爾算法算法普利姆算法算法流程我的理解任選一個(gè)元素,作為起始點(diǎn)將起始點(diǎn)標(biāo)記為,代表該點(diǎn)已經(jīng)加入最小生成樹(shù)集合計(jì)算這個(gè)集合到未加入的各個(gè)點(diǎn)的距離選擇一個(gè)最小的距離點(diǎn),加入集合,即標(biāo)記為已訪問(wèn)更新集合到其
最小生成樹(shù)有兩種生成算法
Prim(普里姆算法)
Kruskal(克魯斯克爾)算法
Prim 算法(普利姆算法)
算法流程:(我的理解)
任選一個(gè)元素,作為起始點(diǎn)
將起始點(diǎn)標(biāo)記為visit,代表該點(diǎn)已經(jīng)加入最小生成樹(shù)集合
計(jì)算這個(gè)集合到未加入的各個(gè)點(diǎn)的距離
選擇一個(gè)最小的距離點(diǎn),加入集合,即標(biāo)記為已訪問(wèn)
更新集合到其他各個(gè)點(diǎn)的最小距離
迭代
存疑
- 目前沒(méi)有找到記錄下路徑的辦法,不知道是不是還沒(méi)理解到位Java 實(shí)現(xiàn)
package com.edu.chapter03; import org.junit.Test; public class MinimumTree { /** * 最小生成樹(shù) */ int n; int e[][]; int dis[]; public void createMinmumTree() { int pos = 1; // 從1節(jié)點(diǎn)開(kāi)始,可以任意指定;pos 代表當(dāng)前要加入最小生成樹(shù)集合的編號(hào) int join[] = new int[n + 1]; // 記錄各個(gè)點(diǎn)加入的情況 int weight = 0; // 初始化最小生成樹(shù)集合與其他各個(gè)點(diǎn)的距離 for (int i = 1; i <= n; i++) { dis[i] = i == pos ? 0 : e[pos][i]; } for (int i = 2; i <= n; i++) { // 從尋找第二個(gè)點(diǎn)開(kāi)始(并不是代表要把2號(hào)點(diǎn)添加進(jìn)去) int min = Integer.MAX_VALUE; for (int j = 1; j <= n; j++) { if (join[j] == 0 && dis[j] !=0 && min > dis[j]) { // 找出集合距離未加入的點(diǎn)的最近邊及點(diǎn);dis[j]!=0 表示跳過(guò)和自己的比較 min = dis[j]; pos = j; // 找到最小位置,下一個(gè)要加入的點(diǎn)就是這個(gè)點(diǎn) } } join[pos] = 1; // 標(biāo)記為以加入最小生成樹(shù)集合 weight += min; //重新計(jì)算集合距離其他點(diǎn)的距離 for (int j = 1; j <= n; j++) { if (join[j] == 0 && dis[j] > e[pos][j]) { // 比較新加入的點(diǎn)是否帶來(lái)的更短的距離, dis[j] = e[pos][j]; //有,則更新。保證dis里存儲(chǔ)的是到其他點(diǎn)的最近距離 } } } System.out.println("weight:" + weight); } @Test public void test01() { n = 6; e = new int[n + 1][n + 1]; dis = new int[n + 1]; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (i == j) { e[i][j] = 0; } else { e[i][j] = Integer.MAX_VALUE; } } } e[1][2] = e[2][1] = 2; e[1][3] = e[3][1] = 4; e[1][4] = e[4][1] = 7; e[2][3] = e[3][2] = 1; e[2][5] = e[5][2] = 2; e[3][4] = e[4][3] = 1; e[3][5] = e[5][3] = 6; createMinmumTree(); } }Kruskal(克魯斯克爾)算法
算法思路
首先將圖中的邊按權(quán)重大小排序(從小到大)
可以使用快速排序或者堆排序
取出一條邊,將邊對(duì)應(yīng)的兩個(gè)節(jié)點(diǎn)放入一個(gè)集合
如果集合中已經(jīng)存在這兩個(gè)點(diǎn),則放棄該邊
不斷有邊加入,將不同的集合連起來(lái),直到集合包含了所有節(jié)點(diǎn),結(jié)束
每次有效添加的一條邊,代表了最小生成樹(shù)中對(duì)應(yīng)的邊,或者說(shuō)路徑
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71310.html
摘要:現(xiàn)在要求在這樣一棵生成樹(shù)中,找到生成樹(shù)的高度最低的所有根節(jié)點(diǎn)。然后利用鄰接表的相關(guān)屬性來(lái)判斷當(dāng)前節(jié)點(diǎn)是否是葉節(jié)點(diǎn)。度數(shù)為一的頂點(diǎn)就是葉節(jié)點(diǎn)。這里使用異或的原因是對(duì)同一個(gè)值進(jìn)行兩次異或即可以回到最初值。 題目 For an undirected graph with tree characteristics, we can choose any node as the root. The...
摘要:本期貓薦書(shū)欄目系列之六,就以此為話題,推薦給大家兩本書(shū)它們都叫深度學(xué)習(xí),但是內(nèi)容很不一樣。事實(shí)上,第一本書(shū)被很多人譽(yù)為深度學(xué)習(xí)的圣經(jīng),知名度極高,有一個(gè)昵稱叫作花書(shū)。 最近出了兩件大新聞,相信大家可能有所耳聞。 我來(lái)當(dāng)個(gè)播報(bào)員,給大家轉(zhuǎn)述一下: 1、中國(guó)隊(duì)在第 11 界羅馬尼亞數(shù)學(xué)大師賽(RMM)中無(wú)緣金牌。該項(xiàng)賽事是三大國(guó)際賽事之一,被譽(yù)為中學(xué)奧數(shù)的最高難度。其中一道題,令中國(guó)隊(duì)全軍...
閱讀 3286·2021-11-24 09:38
閱讀 2158·2021-11-23 09:51
閱讀 1750·2021-10-13 09:39
閱讀 2624·2021-09-23 11:53
閱讀 1408·2021-09-02 15:40
閱讀 3660·2019-08-30 15:54
閱讀 1135·2019-08-30 13:04
閱讀 2566·2019-08-30 11:01