首页
学习
活动
专区
工具
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算法 普里姆算法(Prim算法),图论中一种算法,可在加权连通图里搜索最小生成树。...*/     else return ERROR;  /* 若这样顶点不存在,返回-1作为标记 */ } int Prim( MGraph Graph, LGraph MST ) { /* 将最小生成树保存为邻接表存储图...注意邻接表版本 */     MST = CreateGraph(Graph->Nv);     E = (Edge)malloc( sizeof(struct ENode) ); /* 建立空边结点...,通过其他连法,那么另一种连法与这条边一定构成了环,而环中一定有一条权值大于这条边边,这条边将其替换掉,图仍旧保持连通,但总权值减小了。...注意邻接表版本 */     MST = CreateGraph(Graph->Nv);     TotalWeight = 0; /* 初始化权重和     */     ECount = 0;

88320

加权无向图----Prim算法实现最小生成树

上一篇:加权无向图实现 加权无向图----Kruskal算法实现最小生成树 图生成树是它一棵含有其所有顶点无环连通子图,加权图最小生成树(MST)是它一棵权值最小生成树。...切分定理是解决最小生成树问题所有算法基础。  Prim算法能够得到任意加权连通无向图最小生成树。...Prim延时实现: 延时实现比较简单,它会在优先权队列中保存已经失效边。...; } } Prim算法延时实现计算一个含V个顶点和E条边连通加权无向图最小生成树所需空间与E成正比,所需时间与ElogE成正比(最坏情况)。...Prim即时实现: 要改进LazyPrimMST,可以尝试从优先队列中删除用不到边。关键在于,我们关注只是连接树顶点和非树顶点中权重最小边。

1.6K00

Prim算法简易教程(~简单易懂,附最详细注释代码)

文章目录 1 最小生成树(Minimum Spanning Tree,MST) 2 Prim算法 2.1 简介 2.2 具体步骤 2.3 算法示例图 2.4 算法实现 2.5 算法分析 2.6 测试...那么,我们如何来求最小生成树呢,由最小生成树定义我们可以知道构建最小生成树是可以利用贪心算法去实现,我们接下来介绍两种算法也都是利用贪心算法去求得 M S T MST MST。...(来源于维基百科) 2.2 具体步骤 Prim算法是利用贪心算法实现,我们确定根节点,从这个结点出发。普里姆算法按照以下步骤逐步扩大树中所含顶点数目,直到遍及连通图所有顶点。...2.3 算法示例图 2.4 算法实现 我们如果对Dijkstra算法很熟悉的话,Prim算法也很好实现了,它们都是利用了一样思路,但却不相同。...我们利用 l o w c o s t lowcost lowcost数组来表示到集合中最近距离, c l o s e s t closest closest数组来表示最小生成树边。

87710

最小生成树算法(上)——Prim(普里姆)算法

对于最小生成树算法最著名有两种:Prim算法与Kruskal算法。 ---- Prim算法 Prim算法思想描述: Prim算法可以简单描述成一句话:让一个小树慢慢长大。...即从输入起始结点看成一棵树,之后一步步收录那些与已经被收录结点相邻最近结点。可以看出Prim算法堆稠密图较为合适。...Prim算法过程描述: 1)首先定一个最小生成树MST初始化为空(即不含有任何边),初始化距离数组dist为正无穷,表示所有结点到最小生成树距离(即不可达),定义父亲数组parent来记录一个结点父亲结点...//普里姆(Prim)算法,已vertex为根节点最小生成树 int Prim(int vertex){ int cnt = 0; /...void Print_Prim(){ vector:: iterator it; cout<<"Prim算法构造最小生成树边集合为

86220

GREEDY ALGORITHMS II

MST算法常用于解决优化问题,如网络设计、电力传输等领域。 常见MST算法有两种:Kruskal算法和Prim算法。...Prim’s algorithm适用于稠密图,即节点之间边相对较多情况。在实现上,通常使用优先级队列(最小堆)来维护未访问节点权重,并通过快速查找和更新节点权重来加速算法执行。...算法实现 import heapq def prim(graph): num_nodes = len(graph) visited = [False] * num_nodes..., total_weight = prim(graph) print("最小生成树边列表及其权重:") print(mst) print("最小生成树总权重:", total_weight...Borůvka’s算法一个关键特点是它可以并行地处理多个连通组件,因此在具备多个处理单元或计算机情况下,它可以实现较高计算效率。

15710

最小生成树之Prim贪心算法

设图G顶点集合为U,首先任意选择图G中一点作为起始点a,将该点加入集合V,再从集合U-V中找到另一点b使得点b到V中任意一点权值最小,此时将b点也加入集合V;以此类推,现在集合V={a,b},再从集合...U-V中找到另一点c使得点c到V中任意一点权值最小,此时将c点加入集合V,直至所有顶点全部被加入V,此时就构建出了一颗MST。...因为有N个顶点,所以该MST就有N-1条边,每一次向集合V中加入一个点,就意味着找到一条MST边。 ? ? ? ? ? ?...namespace std;      #define MAX 100   #define MAXCOST 0x7fffffff      int graph[MAX][MAX];      int prim...cost;           graph[i][j] = cost;           graph[j][i] = cost;       }       //求解最小生成树       cost = prim

61910

GREEDY ALGORITHMS II

MST算法常用于解决优化问题,如网络设计、电力传输等领域。 常见MST算法有两种:Kruskal算法和Prim算法。...Prim’s algorithm适用于稠密图,即节点之间边相对较多情况。在实现上,通常使用优先级队列(最小堆)来维护未访问节点权重,并通过快速查找和更新节点权重来加速算法执行。...算法实现 import heapq def prim(graph): num_nodes = len(graph) visited = [False] * num_nodes..., total_weight = prim(graph) print("最小生成树边列表及其权重:") print(mst) print("最小生成树总权重:", total_weight...Borůvka’s算法一个关键特点是它可以并行地处理多个连通组件,因此在具备多个处理单元或计算机情况下,它可以实现较高计算效率。

17020

最小生成树算法(下)——Kruskal(克鲁斯卡尔)算法

概要 在我上一篇文章最小生成树算法(上)——Prim(普里姆)算法 主要讲解对于稠密图较为合适Prim算法。那么在接下里这片文章中我主要讲解对于稀疏图较为合适Kruskal算法。...---- Kruskal算法 Kruskal算法思想概述: 如果说Prim算法可以让一颗小树慢慢长大,那么Kruskal算法也可以一句话来总结:将森林合并成树。...就是说它比Prim算法更直接贪心,把每个顶点看成一棵树,那么恶整个图就是一个森林。要做就是一步一步把最小边收录到最小生成树且与最小生成树里边不构成回路。...this->MST.push_back(min_edge); this->MST[edge_cnt++] = min_edge;...由于出在考研期间,想巩固各种数据结构各种操作,故最小堆没有用stlmake_heap()或者优先队列,而是自己手动实现最小堆,故代码看起来很长,故有关最小堆或者最大堆相关内容请移步我另一篇博客:

1.2K20

东哥带你刷图论第五期:Kruskal 最小生成树算法

最小生成树算法主要有 Prim 算法(普里姆算法)和 Kruskal 算法(克鲁斯卡尔算法)两种,这两种算法虽然都运用了贪心思想,但从实现上来说差异还是蛮大,本文先来讲 Kruskal 算法,Prim...先来看看力扣第 261 题「以图判树」,我描述下题目: 给你输入编号从0到n - 1n个结点,和一个无向边列表edges(每条边节点二元组表示),请你判断输入这些边组成结构是否是一棵树。...mst : -1; } class UF { // 见上文代码实现 } 这道题就解决了,整体思路和上一道题非常类似,你可以认为树判定算法加上按权重排序逻辑就变成了 Kruskal 算法。...,但这样的话不便执行 Union-Find 算法;所以我们 points 数组中索引代表每个坐标点,这样就可以直接复用之前 Kruskal 算法逻辑了。...本文就到这里,关于这种贪心思路简单证明以及 Prim 最小生成树算法,我们留到后续文章再聊。

1.9K40

最小生成树Kruskal算法

定义: 一个有 n 个结点连通图生成树是原图极小连通子图,且包含原图中所有 n 个结点,并且有保持图连通最少边。...[1] 最小生成树可以kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。...之后,从网边集 E 中选取一条权值最小边,若该条边两个顶点分属不同树,则将其加入子图,也就是说,将这两个顶点分别所在两棵树合成一棵树;反之,若该条边两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小边再试之...(self, item1, item2): self[item2] = self[item1] def Kruskal_1(nodes, edges): '''基于不相交集实现...Kruskal算法''' forest = DisjointSet(nodes) MST = [] for item in nodes: print(item)

1.9K20

Java 实现梯度下降

来自作者投稿  作者:覃佑桦 www.baeldung.com/java-gradient-descent 1.引言 文本会学习梯度下降算法。我们将分步对算法实现过程进行说明并用Java实现。...实践中,算法采用是回溯(backtrack)。接下来我们将采用回溯实现梯度下降。 4.分步说明 梯度下降需要一个函数和一个起点作为输入。让我们定义并绘制一个函数: ? ? 可以从任何期望点开始。...第一步,梯度下降以预定步长沿斜率下降: ? 接下来以相同步长继续前进。但是,这次结束时y 值比上次大: ? 这就表明算法已超过了局部最小值,因此较小步长后退: ?...5.Java实现 有几种方法能够实现梯度下降。这里没有采用计算函数导数来确定斜率方向,因此我们实现也适用于不可微函数。...还用Java对算法进行了实现,完整源代码可以从 GitHub 下载。

1.5K10
领券