Java實(shí)現(xiàn)Kruskal算法的示例代碼
介紹
構(gòu)造最小生成樹(shù)還有一種算法,即 Kruskal 算法:設(shè)圖 G=(V,E)是無(wú)向連通帶權(quán)圖,V={1,2,...n};設(shè)最小生成樹(shù) T=(V,TE),該樹(shù)的初始狀態(tài)只有 n 個(gè)節(jié)點(diǎn)而無(wú)邊的非連通圖T=(V,{}),Kruskal 算法將這n 個(gè)節(jié)點(diǎn)看成 n 個(gè)孤立的連通分支。它首先將所有邊都按權(quán)值從小到大排序,然后值要在 T 中選的邊數(shù)不到 n-1,就做這樣貪心選擇:在邊集 E 中選擇權(quán)值最小的邊(i,j),如果將邊(i,j)加入集合 TE 中不產(chǎn)生回路,則將邊(i,j)加入邊集 TE 中,即用邊(i,j)將這兩個(gè)分支合并成一個(gè)連通分支;否則繼續(xù)選擇下一條最短邊。把邊(i,j)從集合 E 中刪去,繼續(xù)上面的貪心選擇,直到 T 中的所有節(jié)點(diǎn)都在同一個(gè)連通分支上為止。此時(shí),選取的 n-1 條邊恰好構(gòu)成圖 G 的一棵最小生成樹(shù) T。
Kruskal 算法用一種非常聰明的方法,就是運(yùn)用集合避圈;如果所選擇加入邊的起點(diǎn)和終點(diǎn)都在 T 集合中,就可以斷定會(huì)形成回路,變的兩個(gè)節(jié)點(diǎn)不能屬于同一個(gè)集合。
算法步驟
1 初始化。將所有邊都按權(quán)值從小到大排序,將每個(gè)節(jié)點(diǎn)集合號(hào)都初始化為自身編號(hào)。
2 按排序后的順序選擇權(quán)值最小的邊(u,v)。
3 如果節(jié)點(diǎn) u 和 v 屬于兩個(gè)不同的連通分支,則將邊(u,v)加入邊集 TE 中,并將兩個(gè)連通分支合并。
4 如果選取的邊數(shù)小于 n-1,則轉(zhuǎn)向步驟2,否則算法結(jié)束。
一、構(gòu)建后的圖

二、代碼
package graph.kruskal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Kruskal {
static final int N = 100;
static int fa[] = new int[N];
static int n;
static int m;
static Edge e[] = new Edge[N * N];
static List<Edge> edgeList = new ArrayList();
static {
for (int i = 0; i < e.length; i++) {
e[i] = new Edge();
}
}
// 初始化集合號(hào)為自身
static void Init(int n) {
for (int i = 1; i <= n; i++)
fa[i] = i;
}
// 合并
static int Merge(int a, int b) {
int p = fa[a];
int q = fa[b];
if (p == q) return 0;
for (int i = 1; i <= n; i++) { // 檢查所有結(jié)點(diǎn),把集合號(hào)是 q 的改為 p
if (fa[i] == q)
fa[i] = p; // a 的集合號(hào)賦值給 b 集合號(hào)
}
return 1;
}
// 求最小生成樹(shù)
static int Kruskal(int n) {
int ans = 0;
Collections.sort(edgeList);
for (int i = 0; i < m; i++)
if (Merge(edgeList.get(i).u, edgeList.get(i).v) == 1) {
ans += edgeList.get(i).w;
n--;
if (n == 1)//n-1次合并算法結(jié)束
return ans;
}
return 0;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
Init(n);
for (int i = 1; i <= m; i++) {
e[i].u = scanner.nextInt();
e[i].v = scanner.nextInt();
e[i].w = scanner.nextInt();
edgeList.add(e[i]);
}
System.out.println("最小的花費(fèi)是:" + Kruskal(n));
}
}
class Edge implements Comparable {
int u;
int w;
int v;
@Override
public int compareTo(Object o) {
if (this.w > ((Edge) o).w) {
return 1;
} else if (this.w == ((Edge) o).w) {
return 0;
} else {
return -1;
}
}
}三、測(cè)試
綠色為輸入,白色為輸出。

到此這篇關(guān)于Java實(shí)現(xiàn)Kruskal算法的示例代碼的文章就介紹到這了,更多相關(guān)Java Kruskal算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA快速部署Spring?Boot?項(xiàng)目到Docker的實(shí)現(xiàn)方法
本文主要介紹了IDEA快速部署Spring?Boot?項(xiàng)目到Docker的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
springboot實(shí)現(xiàn)maven多模塊和打包部署
本文主要介紹了springboot實(shí)現(xiàn)maven多模塊和打包部署,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Java實(shí)現(xiàn)醫(yī)院管理系統(tǒng)
這篇文章主要介為大家詳細(xì)紹了Java實(shí)現(xiàn)醫(yī)院管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
jpa多數(shù)據(jù)源時(shí)Hibernate配置自動(dòng)生成表不生效的解決
這篇文章主要介紹了jpa多數(shù)據(jù)源時(shí)Hibernate配置自動(dòng)生成表不生效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
在Java8與Java7中HashMap源碼實(shí)現(xiàn)的對(duì)比
這篇文章主要介紹了在Java8與Java7中HashMap源碼實(shí)現(xiàn)的對(duì)比,內(nèi)容包括HashMap 的原理簡(jiǎn)單介紹、結(jié)合源碼在Java7中是如何解決hash沖突的以及優(yōu)缺點(diǎn),結(jié)合源碼以及在Java8中如何解決hash沖突,balance tree相關(guān)源碼介紹,需要的朋友可以參考借鑒。2017-01-01
使用java + OpenCV破解頂象面積驗(yàn)證碼的示例
這篇文章主要介紹了使用java + OpenCV破解頂象面積驗(yàn)證碼的示例,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
Java集合之Map接口的實(shí)現(xiàn)類(lèi)精解
Map提供了一種映射關(guān)系,其中的元素是以鍵值對(duì)(key-value)的形式存儲(chǔ)的,能夠?qū)崿F(xiàn)根據(jù)key快速查找value;Map中的鍵值對(duì)以Entry類(lèi)型的對(duì)象實(shí)例形式存在;鍵(key值)不可重復(fù),value值可以重復(fù),一個(gè)value值可以和很多key值形成對(duì)應(yīng)關(guān)系,每個(gè)建最多只能映射到一個(gè)值2021-09-09
基于SpringBoot應(yīng)用監(jiān)控Actuator安全隱患及解決方式
這篇文章主要介紹了SpringBoot應(yīng)用監(jiān)控Actuator安全隱患及解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07

