欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實現(xiàn)Kruskal算法的示例代碼

 更新時間:2022年07月11日 10:18:59   作者:chengqiuming  
Kruskal算法是一種用來尋找最小生成樹的算法,由Joseph Kruskal在1956年發(fā)表。用來解決同樣問題的還有Prim算法和Boruvka算法等。本文將介紹用Java語言實現(xiàn)Kruskal算法的示例代碼,需要的可以參考一下

介紹

構(gòu)造最小生成樹還有一種算法,即 Kruskal 算法:設(shè)圖 G=(V,E)是無向連通帶權(quán)圖,V={1,2,...n};設(shè)最小生成樹 T=(V,TE),該樹的初始狀態(tài)只有 n 個節(jié)點而無邊的非連通圖T=(V,{}),Kruskal 算法將這n 個節(jié)點看成 n 個孤立的連通分支。它首先將所有邊都按權(quán)值從小到大排序,然后值要在 T 中選的邊數(shù)不到 n-1,就做這樣貪心選擇:在邊集 E 中選擇權(quán)值最小的邊(i,j),如果將邊(i,j)加入集合 TE 中不產(chǎn)生回路,則將邊(i,j)加入邊集 TE 中,即用邊(i,j)將這兩個分支合并成一個連通分支;否則繼續(xù)選擇下一條最短邊。把邊(i,j)從集合 E 中刪去,繼續(xù)上面的貪心選擇,直到 T 中的所有節(jié)點都在同一個連通分支上為止。此時,選取的 n-1 條邊恰好構(gòu)成圖 G 的一棵最小生成樹 T。

Kruskal 算法用一種非常聰明的方法,就是運用集合避圈;如果所選擇加入邊的起點和終點都在 T 集合中,就可以斷定會形成回路,變的兩個節(jié)點不能屬于同一個集合。

算法步驟

1 初始化。將所有邊都按權(quán)值從小到大排序,將每個節(jié)點集合號都初始化為自身編號。

2 按排序后的順序選擇權(quán)值最小的邊(u,v)。

3 如果節(jié)點 u 和 v 屬于兩個不同的連通分支,則將邊(u,v)加入邊集 TE 中,并將兩個連通分支合并。

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();
        }
    }
 
    // 初始化集合號為自身
    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é)點,把集合號是 q 的改為 p
            if (fa[i] == q)
                fa[i] = p; // a 的集合號賦值給 b 集合號
        }
        return 1;
    }
 
    // 求最小生成樹
    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("最小的花費是:" + 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;
        }
    }
}

三、測試

綠色為輸入,白色為輸出。

到此這篇關(guān)于Java實現(xiàn)Kruskal算法的示例代碼的文章就介紹到這了,更多相關(guān)Java Kruskal算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA快速部署Spring?Boot?項目到Docker的實現(xiàn)方法

    IDEA快速部署Spring?Boot?項目到Docker的實現(xiàn)方法

    本文主要介紹了IDEA快速部署Spring?Boot?項目到Docker的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • springboot實現(xiàn)maven多模塊和打包部署

    springboot實現(xiàn)maven多模塊和打包部署

    本文主要介紹了springboot實現(xiàn)maven多模塊和打包部署,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Java實現(xiàn)醫(yī)院管理系統(tǒng)

    Java實現(xiàn)醫(yī)院管理系統(tǒng)

    這篇文章主要介為大家詳細(xì)紹了Java實現(xiàn)醫(yī)院管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • jpa多數(shù)據(jù)源時Hibernate配置自動生成表不生效的解決

    jpa多數(shù)據(jù)源時Hibernate配置自動生成表不生效的解決

    這篇文章主要介紹了jpa多數(shù)據(jù)源時Hibernate配置自動生成表不生效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 在Java8與Java7中HashMap源碼實現(xiàn)的對比

    在Java8與Java7中HashMap源碼實現(xiàn)的對比

    這篇文章主要介紹了在Java8與Java7中HashMap源碼實現(xiàn)的對比,內(nèi)容包括HashMap 的原理簡單介紹、結(jié)合源碼在Java7中是如何解決hash沖突的以及優(yōu)缺點,結(jié)合源碼以及在Java8中如何解決hash沖突,balance tree相關(guān)源碼介紹,需要的朋友可以參考借鑒。
    2017-01-01
  • Java線程同步Lock同步鎖代碼示例

    Java線程同步Lock同步鎖代碼示例

    這篇文章主要介紹了Java線程同步Lock同步鎖代碼示例,首先介紹了Java線程同步的原理,然后對lock同步鎖作了簡要闡述,分享了代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 使用java + OpenCV破解頂象面積驗證碼的示例

    使用java + OpenCV破解頂象面積驗證碼的示例

    這篇文章主要介紹了使用java + OpenCV破解頂象面積驗證碼的示例,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Java集合之Map接口的實現(xiàn)類精解

    Java集合之Map接口的實現(xiàn)類精解

    Map提供了一種映射關(guān)系,其中的元素是以鍵值對(key-value)的形式存儲的,能夠?qū)崿F(xiàn)根據(jù)key快速查找value;Map中的鍵值對以Entry類型的對象實例形式存在;鍵(key值)不可重復(fù),value值可以重復(fù),一個value值可以和很多key值形成對應(yīng)關(guān)系,每個建最多只能映射到一個值
    2021-09-09
  • 單例模式的反射漏洞和反序列化漏洞代碼實例

    單例模式的反射漏洞和反序列化漏洞代碼實例

    這篇文章主要介紹了單例模式的反射漏洞和反序列化漏洞,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 基于SpringBoot應(yīng)用監(jiān)控Actuator安全隱患及解決方式

    基于SpringBoot應(yīng)用監(jiān)控Actuator安全隱患及解決方式

    這篇文章主要介紹了SpringBoot應(yīng)用監(jiān)控Actuator安全隱患及解決方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論