首頁 Java java教程 如何使用java實作最小生成樹演算法

如何使用java實作最小生成樹演算法

Sep 21, 2023 pm 12:36 PM
使用技巧 java實現 最小生成樹演算法

如何使用java實作最小生成樹演算法

如何使用Java實現最小生成樹演算法

最小生成樹演算法是圖論中的一個經典問題,用於求解一個帶權重的​​連通圖的最小生成樹。本文將介紹如何使用Java語言來實作這個演算法,並提供具體的程式碼範例。

  1. 問題描述
    給定一個連通圖G,其中每條邊都有一個權重,要求求出一個最小生成樹T,使得T中所有邊的權重總和最小。
  2. Prim演算法
    Prim演算法是一種貪心演算法,用於求解最小生成樹問題。它的基本想法是從一個頂點開始,逐步擴展生成樹,每次選取距離已有生成樹最近的頂點,直到所有頂點都加入生成樹。

以下是Prim演算法的Java實作範例:

import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;

class Edge implements Comparable<Edge> {
    int from;
    int to;
    int weight;
    
    public Edge(int from, int to, int weight) {
        this.from = from;
        this.to = to;
        this.weight = weight;
    }
    
    @Override
    public int compareTo(Edge other) {
        return Integer.compare(this.weight, other.weight);
    }
}

public class Prim {
    public static List<Edge> calculateMST(List<List<Edge>> graph) {
        int n = graph.size();
        boolean[] visited = new boolean[n];
        Queue<Edge> pq = new PriorityQueue<>();
        
        // Start from vertex 0
        int start = 0;
        visited[start] = true;
        for (Edge e : graph.get(start)) {
            pq.offer(e);
        }
        
        List<Edge> mst = new ArrayList<>();
        while (!pq.isEmpty()) {
            Edge e = pq.poll();
            int from = e.from;
            int to = e.to;
            int weight = e.weight;
            
            if (visited[to]) {
                continue;
            }
            
            visited[to] = true;
            mst.add(e);
            
            for (Edge next : graph.get(to)) {
                if (!visited[next.to]) {
                    pq.offer(next);
                }
            }
        }
        
        return mst;
    }
}
登入後複製
  1. Kruskal演算法
    Kruskal演算法也是一種貪心演算法,用來解最小生成樹問題。它的基本思想是將圖中的所有邊按照權重從小到大排序,然後依次添加到生成樹中,當添加一條邊時,如果該邊的兩個端點不屬於同一個連通分量,則可以將這兩個端點合併成一個連通分量。

以下是Kruskal演算法的Java實作範例:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Edge implements Comparable<Edge> {
    int from;
    int to;
    int weight;
    
    public Edge(int from, int to, int weight) {
        this.from = from;
        this.to = to;
        this.weight = weight;
    }
    
    @Override
    public int compareTo(Edge other) {
        return Integer.compare(this.weight, other.weight);
    }
}

public class Kruskal {
    public static List<Edge> calculateMST(List<Edge> edges, int n) {
        List<Edge> mst = new ArrayList<>();
        Collections.sort(edges);
        
        int[] parent = new int[n];
        for (int i = 0; i < n; i++) {
            parent[i] = i;
        }
        
        for (Edge e : edges) {
            int from = e.from;
            int to = e.to;
            int weight = e.weight;
            
            int parentFrom = findParent(from, parent);
            int parentTo = findParent(to, parent);
            
            if (parentFrom != parentTo) {
                mst.add(e);
                parent[parentFrom] = parentTo;
            }
        }
        
        return mst;
    }
    
    private static int findParent(int x, int[] parent) {
        if (x != parent[x]) {
            parent[x] = findParent(parent[x], parent);
        }
        
        return parent[x];
    }
}
登入後複製
  1. #範例使用
    下面是一個簡單的範例用法:
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<List<Edge>> graph = new ArrayList<>();
        graph.add(new ArrayList<>());
        graph.add(new ArrayList<>());
        graph.add(new ArrayList<>());
        graph.add(new ArrayList<>());
        
        graph.get(0).add(new Edge(0, 1, 2));
        graph.get(0).add(new Edge(0, 2, 3));
        graph.get(1).add(new Edge(1, 0, 2));
        graph.get(1).add(new Edge(1, 2, 1));
        graph.get(1).add(new Edge(1, 3, 5));
        graph.get(2).add(new Edge(2, 0, 3));
        graph.get(2).add(new Edge(2, 1, 1));
        graph.get(2).add(new Edge(2, 3, 4));
        graph.get(3).add(new Edge(3, 1, 5));
        graph.get(3).add(new Edge(3, 2, 4));
        
        List<Edge> mst = Prim.calculateMST(graph);
        System.out.println("Prim算法得到的最小生成树:");
        for (Edge e : mst) {
            System.out.println(e.from + " -> " + e.to + ",权重:" + e.weight);
        }
        
        List<Edge> edges = new ArrayList<>();
        edges.add(new Edge(0, 1, 2));
        edges.add(new Edge(0, 2, 3));
        edges.add(new Edge(1, 2, 1));
        edges.add(new Edge(1, 3, 5));
        edges.add(new Edge(2, 3, 4));
        
        mst = Kruskal.calculateMST(edges, 4);
        System.out.println("Kruskal算法得到的最小生成树:");
        for (Edge e : mst) {
            System.out.println(e.from + " -> " + e.to + ",权重:" + e.weight);
        }
    }
}
登入後複製

透過執行上面的範例程序,可以得到以下輸出結果:

Prim算法得到的最小生成树:
0 -> 1,权重:2
1 -> 2,权重:1
2 -> 3,权重:4
Kruskal算法得到的最小生成树:
1 -> 2,权重:1
0 -> 1,权重:2
2 -> 3,权重:4
登入後複製

以上就是使用Java實作最小生成樹演算法的具體程式碼範例。透過這些範例程式碼,讀者可以更好地理解和學習最小生成樹演算法的實現過程和原理。希望本文對讀者有幫助。

以上是如何使用java實作最小生成樹演算法的詳細內容。更多資訊請關注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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++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語言實作動態規劃演算法,並提供具體的程式碼範例。一、動態規劃演算法的基本原理動態

如何使用C#編寫最小生成樹演算法 如何使用C#編寫最小生成樹演算法 Sep 19, 2023 pm 01:55 PM

如何使用C#編寫最小生成樹演算法最小生成樹演算法是一種重要的圖論演算法,它用於解決圖的連結性問題。在電腦科學中,最小生成樹是指一個連通圖的生成樹,該生成樹的所有邊的權值總和最小。本文將介紹如何使用C#編寫最小生成樹演算法,並提供具體的程式碼範例。首先,我們需要定義一個圖的資料結構來表示問題。在C#中,可以使用鄰接矩陣來表示圖。鄰接矩陣是一個二維數組,其中每個元素表示

如何使用PHP開發簡單的SEO最佳化功能 如何使用PHP開發簡單的SEO最佳化功能 Sep 20, 2023 pm 04:18 PM

如何使用PHP開發簡單的SEO優化功能SEO(SearchEngineOptimization)即搜尋引擎優化,是指透過改進網站的結構和內容來提高網站在搜尋引擎中的排名,從而獲得更多的自然流量。在網站開發中,如何使用PHP來實現簡單的SEO優化功能呢?本文將介紹一些常用的SEO最佳化技巧和具體的程式碼範例,幫助開發者在PHP專案中實現SEO最佳化。一、使用友好

如何使用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演算法的基本原理是將所有邊依照權重從小到大排序,然後依照權重從小到大的順序依序選擇邊,但不能形成環。具體實作步驟如下:將

如何使用C++中的分治演算法 如何使用C++中的分治演算法 Sep 20, 2023 pm 03:19 PM

如何使用C++中的分治演算法分治演算法是一種將問題分解成若干個子問題,再將子問題的解合併起來得到原問題解的方法。它的應用廣泛,可以用來解決各種類型的問題,包括數學問題、排序問題、圖表問題等等。本文將介紹如何使用C++中的分治演算法,並提供具體的程式碼範例。一、基本思想分治演算法的基本思想是將一個大問題分解成若干個規模較小的子問題,對每個子問題進行遞歸求解,最後合併子問題

輕鬆解決:pip鏡像來源使用技巧的完全指南 輕鬆解決:pip鏡像來源使用技巧的完全指南 Jan 16, 2024 am 10:31 AM

一鍵解決:快速掌握pip鏡像來源的使用技巧導語:pip是Python最常用的套件管理工具,可以方便地安裝、升級和管理Python套件。然而,由於眾所周知的原因,使用預設的鏡像來源下載安裝包速度較慢,為了解決這個問題,我們需要使用國內的鏡像來源。本文將介紹如何快速掌握pip鏡像來源的使用技巧,並提供具體的程式碼範例。了解pip鏡像來源的概念在開始之前,先來了

See all articles