AcWing 858. Prim算法求最小生成树

2024-04-26 00:36

本文主要是介绍AcWing 858. Prim算法求最小生成树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Problem: AcWing 858. Prim算法求最小生成树

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

这是一个经典的图论问题,要求找到一个图的最小生成树。最小生成树是一个图的所有顶点和最小的边的集合,使得所有的顶点都被连接在一起,且总的边的权值最小。
解决这个问题的一个常见方法是使用Prim算法。Prim算法的基本思想是从一个顶点开始,每次选择一条连接已经在树中的顶点和不在树中的顶点的最小权值的边,将这条边以及它的另一个顶点加入到树中,直到所有的顶点都被加入到树中。

解题方法

初始化一个优先队列(最小堆),用于存储所有的边,边的权值越小,优先级越高。
从顶点1开始,将所有与顶点1相连的边加入到优先队列中。
从优先队列中取出一条边,如果这条边的另一个顶点已经在树中,则忽略这条边;否则,将这条边以及它的另一个顶点加入到树中,并将所有与这个顶点相连的边加入到优先队列中。
重复步骤3,直到所有的顶点都被加入到树中,或者优先队列为空。
如果所有的顶点都被加入到树中,那么树中的边的权值之和就是最小生成树的权值;否则,说明图不连通,无法构成生成树。

复杂度

时间复杂度:

O ( m l o g m ) O(mlogm) O(mlogm),其中m是边的数量。每条边都会被加入到优先队列中,并从优先队列中取出,每次操作的时间复杂度都是O(logm)。

空间复杂度:

O ( n + m ) O(n+m) O(n+m),其中n是顶点的数量,m是边的数量。需要O(n)的空间存储顶点的状态,以及O(m)的空间存储边的信息。

Code

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.ArrayList;
import java.util.PriorityQueue;public class Main {static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));static StreamTokenizer sr = new StreamTokenizer(in);static int n, m;static ArrayList<ArrayList<int[]>> graph = new ArrayList<>();static PriorityQueue<int[]> heap = new PriorityQueue<>((a, b) -> a[1] - b[1]);public static void main(String[] args) throws IOException {n = nextInt();m = nextInt();graph.clear();heap.clear();for (int i = 0; i <= n; i++) {graph.add(new ArrayList<>());}for (int i = 0, u, v, w; i < m; i++) {u = nextInt();v = nextInt();w = nextInt();graph.get(u).add(new int[] { v, w });graph.get(v).add(new int[] { u, w });}for (int[] edge : graph.get(1)) {heap.add(edge);}boolean[] set = new boolean[n + 1];set[1] = true;int ans = 0;int nodeCnt = 1;while (!heap.isEmpty()) {int[] edge = heap.poll();if (!set[edge[0]]) {nodeCnt++;set[edge[0]] = true;ans += edge[1];for(int[] next : graph.get(edge[0])) {heap.add(next);}}}out.println(nodeCnt == n ? ans : "impossible");out.flush();}static int nextInt() throws IOException {sr.nextToken();return (int) sr.nval;}}

这篇关于AcWing 858. Prim算法求最小生成树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/936234

相关文章

nginx生成自签名SSL证书配置HTTPS的实现

《nginx生成自签名SSL证书配置HTTPS的实现》本文主要介绍在Nginx中生成自签名SSL证书并配置HTTPS,包括安装Nginx、创建证书、配置证书以及测试访问,具有一定的参考价值,感兴趣的可... 目录一、安装nginx二、创建证书三、配置证书并验证四、测试一、安装nginxnginx必须有"-

Java实战之利用POI生成Excel图表

《Java实战之利用POI生成Excel图表》ApachePOI是Java生态中处理Office文档的核心工具,这篇文章主要为大家详细介绍了如何在Excel中创建折线图,柱状图,饼图等常见图表,需要的... 目录一、环境配置与依赖管理二、数据源准备与工作表构建三、图表生成核心步骤1. 折线图(Line Ch

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram