首頁 Java java教程 如何使用java實作Kruskal演算法

如何使用java實作Kruskal演算法

Sep 19, 2023 am 11:39 AM
java實現 kruskal演算法

如何使用java實作Kruskal演算法

如何使用Java實作Kruskal演算法

Kruskal演算法是一種常用來解決最小生成樹問題的演算法,它以邊為切入點,逐步建立最小生成樹。在本文中,我們將詳細介紹如何使用Java實作Kruskal演算法,並提供具體的程式碼範例。

  1. 演算法原理
    Kruskal演算法的基本原理是將所有邊按照權重從小到大進行排序,然後按照權重從小到大的順序依次選擇邊,但不能形成環。具體實作步驟如下:

    • 將所有邊依照權重從小到大排序。
    • 建立一個空的集合,用來存放最小生成樹的邊。
    • 遍歷排序後的邊,依序判斷目前邊的兩個頂點是否在同一個集合中。如果不在同一個集合中,則將目前邊加入最小生成樹的集合中,並將兩個頂點合併為一個集合。
    • 繼續遍歷,直到最小生成樹的邊數等於頂點數減一。
  2. Java程式碼實作
    以下是使用Java語言實作Kruskal演算法的程式碼範例:
import java.util.*;

class Edge implements Comparable<Edge> {
    int src, dest, weight;

    public int compareTo(Edge edge) {
        return this.weight - edge.weight;
    }
}

class Subset {
    int parent, rank;
}

class Graph {
    int V, E;
    Edge[] edges;

    public Graph(int v, int e) {
        V = v;
        E = e;
        edges = new Edge[E];
        for (int i = 0; i < e; ++i)
            edges[i] = new Edge();
    }

    int find(Subset[] subsets, int i) {
        if (subsets[i].parent != i)
            subsets[i].parent = find(subsets, subsets[i].parent);

        return subsets[i].parent;
    }

    void union(Subset[] subsets, int x, int y) {
        int xroot = find(subsets, x);
        int yroot = find(subsets, y);

        if (subsets[xroot].rank < subsets[yroot].rank)
            subsets[xroot].parent = yroot;
        else if (subsets[xroot].rank > subsets[yroot].rank)
            subsets[yroot].parent = xroot;
        else {
            subsets[yroot].parent = xroot;
            subsets[xroot].rank++;
        }
    }

    void KruskalMST() {
        Edge[] result = new Edge[V];
        int e = 0;
        int i = 0;
        for (i = 0; i < V; ++i)
            result[i] = new Edge();

        Arrays.sort(edges);

        Subset[] subsets = new Subset[V];
        for (i = 0; i < V; ++i)
            subsets[i] = new Subset();

        for (int v = 0; v < V; ++v) {
            subsets[v].parent = v;
            subsets[v].rank = 0;
        }

        i = 0;

        while (e < V - 1) {
            Edge next_edge = edges[i++];

            int x = find(subsets, next_edge.src);
            int y = find(subsets, next_edge.dest);

            if (x != y) {
                result[e++] = next_edge;
                union(subsets, x, y);
            }
        }

        System.out.println("Following are the edges in the constructed MST:");
        int minimumCost = 0;
        for (i = 0; i < e; ++i) {
            System.out.println(result[i].src + " -- " + result[i].dest + " == " + result[i].weight);
            minimumCost += result[i].weight;
        }
        System.out.println("Minimum Cost Spanning Tree: " + minimumCost);
    }
}

public class KruskalAlgorithm {
    public static void main(String[] args) {
        int V = 4;
        int E = 5;
        Graph graph = new Graph(V, E);

        graph.edges[0].src = 0;
        graph.edges[0].dest = 1;
        graph.edges[0].weight = 10;

        graph.edges[1].src = 0;
        graph.edges[1].dest = 2;
        graph.edges[1].weight = 6;

        graph.edges[2].src = 0;
        graph.edges[2].dest = 3;
        graph.edges[2].weight = 5;

        graph.edges[3].src = 1;
        graph.edges[3].dest = 3;
        graph.edges[3].weight = 15;

        graph.edges[4].src = 2;
        graph.edges[4].dest = 3;
        graph.edges[4].weight = 4;

        graph.KruskalMST();
    }
}
登入後複製

以上程式碼實作了一個簡單的圖類( Graph),包含邊類(Edge)和並查集類別(Subset)。在主函數中,我們建立一個圖對象,加入邊並呼叫KruskalMST()方法得到最小生成樹。

  1. 結果分析
    經過測試,上述程式碼能夠正確輸出以下結果:
Following are the edges in the constructed MST:
2 -- 3 == 4
0 -- 3 == 5
0 -- 1 == 10
Minimum Cost Spanning Tree: 19
登入後複製

這表示建構的最小生成樹包含了3條邊,權重之和為19。

總結:
透過本文,我們詳細介紹如何使用Java實作Kruskal演算法,並附上了具體的程式碼範例。希望這篇文章能幫助大家更理解並應用Kruskal演算法。

以上是如何使用java實作Kruskal演算法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用java實作動態規劃演算法 如何使用java實作動態規劃演算法 Sep 19, 2023 am 11:16 AM

如何使用Java實現動態規劃演算法動態規劃是一種解決多階段決策問題的最佳化方法,它將問題分解成多個階段,每個階段根據已知資訊做出決策,並記錄下每個決策的結果,以便在後續階段使用。在實際應用中,動態規劃通常用來解決最佳化問題,例如最短路徑、最大子序列和、背包問題等。本文將介紹如何使用Java語言實作動態規劃演算法,並提供具體的程式碼範例。一、動態規劃演算法的基本原理動態

如何使用java實作RSA加密演算法 如何使用java實作RSA加密演算法 Sep 20, 2023 pm 02:33 PM

如何使用Java實作RSA加密演算法RSA(Rivest-Shamir-Adleman)是一種非對稱加密演算法,它是目前最常使用的加密演算法之一。本文將介紹如何使用Java語言來實作RSA加密演算法,並提供具體的程式碼範例。產生金鑰對首先,我們需要產生一對RSA金鑰,它由公鑰和私鑰組成。公鑰可用於加密數據,私鑰用於解密資料。以下是產生RSA金鑰對的程式碼範例:import

使用Java實現線上考試系統的考試安排調整功能 使用Java實現線上考試系統的考試安排調整功能 Sep 25, 2023 am 08:45 AM

線上考試系統考試安排調整功能的Java實現引言:隨著互聯網技術的發展,越來越多的學校和培訓機構選擇使用線上考試系統來進行考試和評估。考試安排調整是線上考試系統中重要的功能,它可以幫助管理員根據實際情況靈活地調整考試時間和考試相關資訊。本文將詳細介紹如何使用Java程式實現線上考試系統的考試安排調整功能,並給出具體的程式碼範例。資料庫設計考試安排調整功能需要

如何使用java實作Kruskal演算法 如何使用java實作Kruskal演算法 Sep 19, 2023 am 11:39 AM

如何使用Java實作Kruskal演算法Kruskal演算法是一種常用來解決最小生成樹問題的演算法,它以邊為切入點,逐步建立最小生成樹。在本文中,我們將詳細介紹如何使用Java實作Kruskal演算法,並提供具體的程式碼範例。演算法原理Kruskal演算法的基本原理是將所有邊依照權重從小到大排序,然後依照權重從小到大的順序依序選擇邊,但不能形成環。具體實作步驟如下:將

利用Java實現的推薦演算法和實現 利用Java實現的推薦演算法和實現 Jun 18, 2023 pm 02:51 PM

隨著互聯網的發展,網路上的數據量呈現爆炸性增長,使得用戶在面對大量資訊時很難快速準確的找到他們真正需要的內容。推薦演算法應運而生,透過對用戶行為數據的記錄和分析為用戶提供個人化的服務和推薦內容,從而提高用戶的滿意度和忠誠度。 Java作為大型軟體開發的首選語言,在推薦演算法的實作中也廣受歡迎。一、推薦演算法推薦演算法是一種透過對使用者互動、行為和興趣數據進行分析與挖掘

Java實作一個全功能線上團建活動預約系統的邏輯流程 Java實作一個全功能線上團建活動預約系統的邏輯流程 Jun 27, 2023 am 11:46 AM

隨著團建活動的逐漸成為一種企業文化,越來越多的企業開始尋找一種方式來為員工策劃和預訂團建活動。而線上團建活動預約系統應運而生。 Java是一種廣泛使用的程式語言,為企業開發線上預訂系統提供了極大的便利性和靈活性。本文將分步驟介紹使用Java實現一個全功能線上團建活動預約系統的邏輯流程。第一步:確定係統需求和功能在開始編寫程式碼之前,必須確定係統需要完成的所有需求

如何利用Java實現倉庫管理系統的庫存調整功能 如何利用Java實現倉庫管理系統的庫存調整功能 Sep 24, 2023 pm 05:09 PM

如何利用Java實現倉庫管理系統的庫存調整功能隨著物流和倉儲產業的不斷發展,倉庫管理系統已成為企業提高效率和管理能力的必備工具。而庫存調整作為倉庫管理系統中的重要功能模組,對於準確掌握商品庫存狀況、及時做出調整和統計,以及提高營運效率具有重要意義。本文將介紹如何利用Java程式語言實作倉庫管理系統的庫存調整功能,並給出具體的程式碼範例。首先,我們需要考慮

如何使用java實作選擇排序演算法 如何使用java實作選擇排序演算法 Sep 19, 2023 am 09:46 AM

如何使用Java實現選擇排序演算法選擇排序演算法是一種簡單直觀的排序演算法,它的基本思想是從未排序的元素中找到最小的(或最大的)元素,將其放到已排序序列的末尾。從而逐步建構有序序列。下面我們將以Java程式碼範例的形式介紹如何實作選擇排序演算法。程式碼實作:publicclassSelectionSort{publicstaticvoidselect

See all articles