首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用Java实现Prim的MST

Prim's算法是一种用于解决最小生成树(Minimum Spanning Tree,MST)问题的贪心算法。它通过逐步选择边来构建最小生成树,从一个初始顶点开始,每次选择与当前生成树相连的最小权重边所连接的顶点,并将该边加入生成树中,直到生成树包含了所有顶点。

Java是一种广泛使用的编程语言,具有丰富的库和框架支持,适合用于实现Prim的MST算法。以下是用Java实现Prim的MST算法的示例代码:

代码语言:txt
复制
import java.util.*;

public class PrimMST {
    private static final int V = 5; // 图的顶点数

    // 找到与当前生成树相连的最小权重边所连接的顶点
    private int minKey(int[] key, boolean[] mstSet) {
        int min = Integer.MAX_VALUE;
        int minIndex = -1;

        for (int v = 0; v < V; v++) {
            if (!mstSet[v] && key[v] < min) {
                min = key[v];
                minIndex = v;
            }
        }

        return minIndex;
    }

    // 打印最小生成树
    private void printMST(int[] parent, int[][] graph) {
        System.out.println("边\t权重");
        for (int i = 1; i < V; i++) {
            System.out.println(parent[i] + " - " + i + "\t" + graph[i][parent[i]]);
        }
    }

    // 使用Prim的算法构建最小生成树
    public void primMST(int[][] graph) {
        int[] parent = new int[V]; // 存储最小生成树的父节点
        int[] key = new int[V]; // 存储顶点的权重
        boolean[] mstSet = new boolean[V]; // 记录顶点是否已经加入最小生成树

        // 初始化key数组为无穷大,mstSet数组为false
        for (int i = 0; i < V; i++) {
            key[i] = Integer.MAX_VALUE;
            mstSet[i] = false;
        }

        key[0] = 0; // 将第一个顶点作为起始顶点
        parent[0] = -1; // 第一个顶点没有父节点

        for (int count = 0; count < V - 1; count++) {
            int u = minKey(key, mstSet); // 找到与当前生成树相连的最小权重边所连接的顶点
            mstSet[u] = true; // 将该顶点加入最小生成树

            // 更新与u相邻的顶点的权重
            for (int v = 0; v < V; v++) {
                if (graph[u][v] != 0 && !mstSet[v] && graph[u][v] < key[v]) {
                    parent[v] = u;
                    key[v] = graph[u][v];
                }
            }
        }

        printMST(parent, graph); // 打印最小生成树
    }

    public static void main(String[] args) {
        PrimMST mst = new PrimMST();
        int[][] graph = new int[][] {
            { 0, 2, 0, 6, 0 },
            { 2, 0, 3, 8, 5 },
            { 0, 3, 0, 0, 7 },
            { 6, 8, 0, 0, 9 },
            { 0, 5, 7, 9, 0 }
        };
        mst.primMST(graph);
    }
}

这段代码实现了Prim的MST算法,通过传入一个邻接矩阵表示的图,计算并打印出最小生成树的边及其权重。

在腾讯云的产品中,与云计算和Java开发相关的产品有云服务器(CVM)、云数据库MySQL版、云存储(COS)等。您可以通过访问腾讯云官网了解更多关于这些产品的详细信息和使用方式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

生成树和最小生成树prim,kruskal

普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现;1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算法又被称为DJP算法、亚尔尼克算法或普里姆-亚尔尼克算法。 中文名 普里姆算法 外文名 Prim Algorithm 别 称 最小生成树算法 提出者 沃伊捷赫·亚尔尼克(Vojtěch Jarník) 提出时间 1930年 应用学科 计算机,数据结构,数学(图论) 适用领域范围 应用图论知识的实际问题 算 法 贪心 目录 1 算法描述 2 时间复杂度 3 图例描述 4 代码 ▪ PASCAL代码 ▪ c代码 ▪ C++代码 5 时间复杂度 算法描述编辑 1).输入:一个加权连通图,其中顶点集合为V,边集合为E; 2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空; 3).重复下列操作,直到Vnew = V: a.在集合E中选取权值最小的边,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一); b.将v加入集合Vnew中,将边加入集合Enew中; 4).输出:使用集合Vnew和Enew来描述所得到的最小生成树。

02

【算法与数据结构】--高级算法和数据结构--高级数据结构

堆(Heap)是一种特殊的树状数据结构,通常用于实现优先队列。堆有两种主要类型:最大堆和最小堆。最大堆是一棵树,其中每个父节点的值都大于或等于其子节点的值,而最小堆是一棵树,其中每个父节点的值都小于或等于其子节点的值。堆的主要特点是根节点具有最大或最小值,这使得堆非常适合处理具有优先级的数据。 优先队列(Priority Queue)是一种抽象数据类型,通常基于堆实现。它允许在插入元素时指定优先级,并在删除元素时始终返回具有最高(或最低)优先级的元素。这使得优先队列适用于需要按优先级处理元素的应用,如任务调度、图算法(如Dijkstra算法)、模拟系统等。 以下是关于堆和优先队列的关键点:

03
领券