>  기사  >  Java  >  Java를 사용하여 Kruskal 알고리즘을 구현하는 방법

Java를 사용하여 Kruskal 알고리즘을 구현하는 방법

WBOY
WBOY원래의
2023-09-19 11:39:221276검색

Java를 사용하여 Kruskal 알고리즘을 구현하는 방법

Java에서 Kruskal 알고리즘을 구현하는 방법

Kruskal 알고리즘은 최소 신장 트리 문제를 해결하는 데 일반적으로 사용되는 알고리즘입니다. Edge를 진입점으로 사용하여 점차적으로 최소 신장 트리를 구축합니다. 이 기사에서는 Java를 사용하여 Kruskal의 알고리즘을 구현하는 방법을 자세히 설명하고 구체적인 코드 예제를 제공합니다.

  1. 알고리즘 원리
    크루스칼 알고리즘의 기본 원리는 모든 edge를 가중치에 따라 작은 것부터 큰 것 순으로 정렬한 후 작은 것부터 큰 것 순으로 edge를 선택하는 것이지만 순환을 형성할 수는 없습니다. 구체적인 구현 단계는 다음과 같습니다.

    • 무게에 따라 모든 가장자리를 작은 것부터 큰 것까지 정렬합니다.
    • 최소 스패닝 트리의 가장자리를 저장하기 위해 빈 세트를 만듭니다.
    • 정렬된 가장자리를 탐색하고 현재 가장자리의 두 정점이 동일한 세트에 있는지 확인합니다. 동일한 세트에 있지 않은 경우 현재 가장자리를 최소 스패닝 트리 세트에 추가하고 두 정점을 하나의 세트로 병합합니다.
    • 최소 스패닝 트리의 가장자리 수가 정점 수에서 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();
    }
}

위 코드는 에지 클래스(Edge) 및 통합 검색 클래스(Subset)를 포함하여 간단한 그래프 클래스(Graph)를 구현합니다. ) ). 기본 함수에서는 그래프 개체를 만들고 가장자리를 추가한 다음 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라는 의미입니다.

요약:
이 글을 통해 크루스칼의 알고리즘을 자바를 이용하여 구현하는 방법을 자세히 소개하고, 구체적인 코드 예시를 첨부했습니다. 이 글이 모든 사람이 Kruskal 알고리즘을 더 잘 이해하고 적용하는 데 도움이 되기를 바랍니다.

위 내용은 Java를 사용하여 Kruskal 알고리즘을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.