ホームページ  >  記事  >  Java  >  Javaを使用してKruskalアルゴリズムを実装する方法

Javaを使用してKruskalアルゴリズムを実装する方法

WBOY
WBOYオリジナル
2023-09-19 11:39:221328ブラウズ

Javaを使用してKruskalアルゴリズムを実装する方法

Java を使用して Kruskal アルゴリズムを実装する方法

Kruskal アルゴリズムは、最小スパニング ツリー問題を解決するために一般的に使用されるアルゴリズムで、エッジをエントリ ポイントとして使用します。最小のスパニング ツリーを徐々に構築します。この記事では、Java を使用して Kruskal のアルゴリズムを実装する方法を詳しく説明し、具体的なコード例を示します。

  1. アルゴリズム原理
    Kruskal アルゴリズムの基本原理は、すべてのエッジを重みに従って小さいものから大きいものまでソートし、小さいものから大きいものへ順番にエッジを選択することです。サイクルを形成できません。具体的な実装手順は次のとおりです。

    • すべてのエッジを重みに従って小さいものから大きいものまで並べ替えます。
    • 最小スパニング ツリーのエッジを格納する空のセットを作成します。
    • ソートされたエッジをトラバースし、現在のエッジの 2 つの頂点が同じセット内にあるかどうかを確認します。同じセット内にない場合は、現在のエッジを最小スパニング ツリーのセットに追加し、2 つの頂点を 1 つのセットにマージします。
    • 最小スパニング ツリーのエッジの数が頂点の数から 1 を引いた数に等しくなるまでトラバースを続けます。
  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) を含みます。 main 関数では、グラフ オブジェクトを作成し、エッジを追加し、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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。