图论----最小生成树讲解与相关题解

目前已更新系列

当前--图论----最小生成树讲解与相关题解

滑动窗口系列算法总结与题解一

算法系列----并查集总结于相关题解

图论---dfs系列

差分与前缀和总结与对应题解(之前笔试真的很爱考)

数论---质数判断、质因子分解、质数筛(埃氏筛、
 

最小生成树

是什么、有什么用

最小生成树:在无向带权图中选择一些边,在保证连通性的情况下,边的总权值最小

最小生成树可能不止一颗,只要保证边的权值最小,那就是最小生成树

如果无向带权图有n个点那么最小生成树一定会有n-1条边

扩展:最小生成树一定是最小瓶颈树

解决该类问题最好用的方法时KrusKal算法

  • 不需要建图,只用使用并查集的思想将建立一个father数组表示当前节点是属于哪个集合
  • 然后将边按照权值进行排序,遍历排序后的边,尝试将边上的点进行合并
  • 遍历完之后如果能够合并的边数==n-1条说明找到了一条最小生成树,没有找到说明该图不连通

一般遇到题目将你求将n个点联通然后求联通之后的每条边的权值最小,

或者求最小瓶颈树,也就是让每个点联通,保证总体权值最小,求在最小瓶颈树上边的最大权值,

Kruskal算法(最常用)

思路
  • 1、把所有的边从小到大进行排序,从权值小的边开始考虑(可以使用最小堆,也可以调用sort进行排序)
  • 2、如果连接当前的边不会形成环,就选择当前的边
  • 3、如果当前的边会形成环,就不要当前的边
  • 4、考察完所有边之后,最小生成树就得到了(或者得到n-1条边之后)

模板

题目链接:【模板】最小生成树 - 洛谷

最小生成树主要是用来求将找出图中所有

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;
import java.util.PriorityQueue;/*** @Author wangdongsheng* @Date 2024/8/19 00:18*/
public class Main {//建图所用public static final int MAXN=5010;public static final int MAXM=2*MAXN;//并查集所用static int[] father=new int[MAXN];//kuraskal算法所用//0:from,1:to,2:weightstatic PriorityQueue<int[]> heap=new PriorityQueue<>((a,b)->a[2]-b[2]);//并查集所用private static void build(int n){for (int i = 0; i <=n; i++) {father[i]=i;}}public static int find(int x){if (father[x]!=x){father[x]=find(father[x]);}return father[x];}//这里合并返回是否是同一个集合是为了如果能合并说明不是环那么计算权制//如果是false那么可能出现环不能计算权制public static boolean union(int x,int y){int fx=find(x);int fy=find(y);if (fx!=fy){father[fx]=fy;return true;}return false;}public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));StreamTokenizer in = new StreamTokenizer(br);in.nextToken();int n=(int) in.nval;in.nextToken();int m=(int) in.nval;build(n);for (int i = 0; i < m; i++) {in.nextToken();int u=(int) in.nval;in.nextToken();int v=(int) in.nval;in.nextToken();int w=(int) in.nval;//放入小根队中,将边进行排序heap.offer(new int[]{u,v,w});}int cnt=0;//记录小根队中弹出的边数用来判断是否有环int ans=0;while (!heap.isEmpty()){int[] poll = heap.poll();int u=poll[0];int v=poll[1];int w=poll[2];if (union(u,v)){cnt++;ans+=w;}}System.out.println(cnt==n-1?ans:"orz");}}

下面是使用sort进行排序的模板

public class 最小生成树 {public static int MAXN=5001;public static int MAXM=200001;public static int[] father=new int[MAXN];public static int[][] eages=new int[MAXM][3];public static void build(int m){for (int i = 1; i <=m ; i++) {father[i]=i;}}public static int find(int a){if(a!=father[a]){father[a]=find(father[a]);}return father[a];}public static boolean union(int a,int b){int fa=find(a);int fb=find(b);if (fa!=fb){//如果两个点代表的集合不是同一个,合并father[fa]=fb;return true;}else {return false;//说明两个点在同一个集合中,则说明要这条边就会形成环,返回false}}public static void main(String[] args) {int n,m;Scanner scanner = new Scanner(System.in);n=scanner.nextInt();m=scanner.nextInt();for (int i = 0; i < m; i++) {eages[i][0] = scanner.nextInt();eages[i][1] =scanner.nextInt();eages[i][2]=scanner.nextInt();}int ans=0;int eageCount=0;//记录合并使用了几条边,用于判断是否联通//排序Arrays.sort(eages,(a,b)->a[2]-b[2]);//以权值进行排序//开始并查集//初始化father数组build(n);for (int[] eage : eages) {if (union(eage[0],eage[1])){//合并eageCount++;ans+=eage[2];//加上权值}//出现环就不要这条边}System.out.println(eageCount==n-1?ans:"orz");}
}

检查边长度限制的路径是否存在

题目描述

解析

这题主要是理解题目:题目的意思就是给你一个请求查询数组queries,然后queries[i][0]表示from,queries[i][1]表示to,queries[i][2]:表示权制,题目就是要找出有没有一条从from到to的路径,使得每一条表的权制不超过限制的权制,

class Solution {//这题要求的是,给定一个查询,查询,u,v,w表示u到v的每一条边必须要小于限制w//所以我们转化一下思维,我们通过最小生成树的思想,同样先合并最小权制的边,//然后,将边权制小于限制的进行合并,//最后查询的时候就直接判断是否在同一个集合中就好了//然后有几个查询我们就做几次最小生成树//然后优化一下,我们可以让查询的边安权制排序后进行找答案,//由于要排序,排序之后原来数组的顺序就改变了,//因此我们数组中还需要记录对应原始的下标,这样就能复用并查集了//这是个无向图public static int MAXN = 100010;public static final int MAXM = 2 * MAXN;public static int[] father = new int[MAXN];//并查集public static void build(int n) {for (int i = 0; i <= n; i++) {father[i] = i;}}public static int find(int x) {if (father[x] != x) {father[x] = find(father[x]);}return father[x];}public static void union(int x, int y) {int fx = find(x);int fy = find(y);if (fx != fy) {father[fx] = fy;}}public static boolean isSame(int x, int y) {return find(x) == find(y);}public boolean[] distanceLimitedPathsExist(int n, int[][] edgeList, int[][] queries) {build(n);//拷贝查询数组,添加一个索引//0:索引,1:索引,2:v,3:wint[][] newQueries = new int[queries.length][4];for (int i = 0; i < queries.length; i++) {newQueries[i][0] = i;newQueries[i][1] = queries[i][0];newQueries[i][2] = queries[i][1];newQueries[i][3] = queries[i][2];}//// 将这个按照权制排序减少重复建立最小生成树Arrays.sort(newQueries, (a, b) -> a[3] - b[3]);//将给的边进行排序Arrays.sort(edgeList, (a, b) -> a[2] - b[2]);boolean[] ans = new boolean[queries.length];//注意i放在外层,因为我们已经对查询的权制进行了排序,那么建立的并查集就是可以复用的int i = 0;for (int[] query : newQueries) {int rw = query[3];int ru = query[1];int rv = query[2];int index = query[0];//并查集for (; i < edgeList.length && (edgeList[i][2] < rw); i++) {int u = edgeList[i][0];int v = edgeList[i][1];union(u, v);}if (isSame(ru, rv)) {ans[index] = true;}}return ans;}
}

繁忙的都市

题目链接:[SCOI2005] 繁忙的都市 - 洛谷

题目描述

解析

这题也是模板题直接套模板就好了

public class Main {public static int MAXN=310;private static int MAXM=2*8010;//这里直接试用最小堆进行排序算了,就不用再去存放边的信息,然后再对边进行排序了private static PriorityQueue<int[]> minHeap=new PriorityQueue<>((a,b)->a[2]-b[2]);//并查集所用//记录并查中有多少条边,每次合并一次,边数就+1static int cnt=0;private static int[] father=new int[MAXN];private static void build(int n){for (int i = 0; i <=n; i++) {father[i]=i;}cnt=0;}private static int find(int x){if (father[x]!=x){father[x]=find(father[x]);}return father[x];}private static void union(int x,int y){int fx=find(x);int fy=find(y);if (fx!=fy){father[fx]=fy;cnt++;}}public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));StreamTokenizer in = new StreamTokenizer(br);in.nextToken();int n=(int)in.nval;in.nextToken();int m=(int)in.nval;build(n);for (int i = 0; i < m; i++) {in.nextToken();int u=(int)in.nval;in.nextToken();int v=(int)in.nval;in.nextToken();int w=(int)in.nval;minHeap.offer(new int[]{u,v,w});
//            minHeap.offer(new int[]{v,u,w});}//Kruskalint max=0;while (!minHeap.isEmpty()){int[] poll = minHeap.poll();max=poll[2];union(poll[0],poll[1]);if (cnt==n-1) break;}System.out.println(cnt+" "+max);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/412559.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 Cilium CNI 集群上运行 vCluster 虚拟集群

上周在 KubeCon China 2024 大会上&#xff0c;我和社区伙伴们作为志愿者在 Cilium 项目展台与用户交流。有位用户询问 Cilium 是否能与 vCluster 集成&#xff0c;当时未能给出明确答复&#xff0c;特地回来后进行了测试。 答案是&#xff1a;在最新的 vCluster v0.20 中容器…

【Python篇】Python 类和对象:详细讲解(上篇)

文章目录 Python 类和对象&#xff1a;详细讲解1. 什么是类&#xff08;Class&#xff09;类的定义 2. 什么是对象&#xff08;Object&#xff09;创建对象 3. 属性和方法属性&#xff08;Attributes&#xff09;方法&#xff08;Methods&#xff09;在类中定义属性和方法使用对…

重生奇迹MU 小清新职业智弓MM

游戏中有一种令人迷醉的职业——智弓MM&#xff0c;她们以高超的射箭技能闻名于世。本文将为您介绍这个悠闲的小清新职业&#xff0c;在游戏中的特点以及如何成为一名出色的智弓MM。跟随我们一起探索这个奇妙而神秘的职业吧&#xff01; 悠闲的游戏节奏是游戏的初衷之一&#…

52 mysql 启动过程中常见的相关报错信息

前言 我们这里主要是看一下 service mysql start, service mysql stop 的过程中的一些常见的错误问题 这些 也是之前经常碰到, 但是 每次都是 去搜索, 尝试 1, 2, 3, 4 去解决问题 但是 从来未曾思考过 这个问题到底是 怎么造成的 The server quit without updating PID fil…

【设计模式】创建型模式——抽象工厂模式

抽象工厂模式 1. 模式定义2. 模式结构3. 实现3.1 实现抽象产品接口3.2 定义具体产品3.3 定义抽象工厂接口3.4 定义具体工厂3.5 客户端代码 4. 模式分析4.1 抽象工厂模式退化为工厂方法模式4.2 工厂方法模式退化为简单工厂模式 5. 模式特点5.1 优点5.2 缺点 6. 适用场景6.1 需要…

用3点结构的s1顺序标定2点结构的s2顺序

在行列可自由变换的条件下&#xff0c;3点结构有6个 (A,B)---6*30*2---(0,1)(1,0) 让A分别是3a1&#xff0c;2&#xff0c;…&#xff0c;6&#xff0c;让B全是0。当收敛误差为7e-4&#xff0c;收敛199次取迭代次数平均值&#xff0c;得到 迭代 搜索难度 1 13913.2 1 2 …

客服系统简易版

整体架构解读 客服端和商城端都通过websocket连接到客服系统, 并定期维持心跳当客户接入客服系统时, 先根据策略选择在线客服, 然后再发送消息给客服 websocket实现 用netty实现websocket协议, 增加心跳处理的handler, 详见chat-server模块 客服路由规则 暂时仅支持轮询的…

视频结构化从入门到精通——视频结构化主要技术介绍

视频结构化主要技术 1 视频接入 “视频接入”是视频结构化管道的起点&#xff08;SRC Point&#xff09;视频接入是视频结构化处理的第一步&#xff0c;它涉及将视频数据从各种采集源获取到系统中进行进一步处理。视频接入的质量和稳定性对后续的数据处理、分析和应用至关重要…

【openwrt-21.02】T750 openwrt-21.02 Linux-5.4.238 input子系统----gpio-keys实现分析

input子系统 输入子系统是由设备驱动层(input driver)、输入核心层(input core)、输入事件处理层(input event handle)组成 input子系统架构图 gpio-keys gpio-keys是基于input子系统实现的一个通用按键驱动,该驱动也符合linux驱动实现模型,即driver和device分离模型.一…

毕设创新点之一:基于GD32/STM32的AI模型部署-github库

将AI模型成功部署到边缘MCU中&#xff0c;常常受限于MCU的计算峰值和内存峰值的限制&#xff0c;部署较为困难&#xff0c;目前有一个将AI算法MCU部署到GD32系列MCU中的宝藏的开源库。 项目网址&#xff1a;HomiKetalys/gd32ai-modelzoo: Provide deployable deep learning mo…

Vue.js 模板语法详解:插值表达式与指令使用指南

Vue.js 模板语法详解&#xff1a;插值表达式与指令使用指南 引言 简要介绍主题&#xff1a; Vue.js 是一个现代化的 JavaScript 框架&#xff0c;用于构建用户界面。Vue 的模板语法提供了直观且功能强大的工具&#xff0c;用于将数据与 DOM 绑定。本文将深入探讨 Vue.js 的两个…

Training language models to follow instructionswith human feedback

Abstract 将语言模型做得更大并不会自动提高它们遵循用户意图的能力。例如&#xff0c;大型语言模型可能会生成不真实、有毒或对用户不有帮助的输出。换句话说&#xff0c;这些模型并未与用户对齐&#xff08;aligned&#xff09;。本文展示了一种通过人类反馈来对齐语言模型与…

2024实战指南:四款全免费的数据恢复工具盘点!

在这个数字化的时代里&#xff0c;数据的安全至关重要。如果一不小心删除或丢失了重要数据应该怎么办呢&#xff1f;这几个全免费的数据恢复工具可以帮你解决问题&#xff0c;亲测好用哦&#xff01; 第一款&#xff1a;福昕数据恢复 直达链接&#xff1a;www.pdf365.cn/foxi…

【并发编程】从AQS机制到同步工具类

AQS机制 Java 中常用的锁主要有两类&#xff0c;一种是 Synchronized 修饰的锁&#xff0c;被称为 Java 内置锁或监视器锁。另一种就是在 JUC 包中的各类同步器&#xff0c;包括 ReentrantLock&#xff08;可重入锁&#xff09;、Semaphore&#xff08;信号量&#xff09;、Co…

Android13 Launcher3 客制化Workspace页面指示器

需求&#xff1a;原生态的workspace页面指示器是个长条&#xff0c;不大好看&#xff0c;需要进行客制化 实现效果如图&#xff1a; 实现原理&#xff1a; 代码实现在WorkspacePageIndicator.java 布局在launcher.xml里 实现在WorkspacePageIndicator.java通过重写onDraw函数…

顺序循环队列

顺序循环队列 队头插入元素&#xff0c;队尾删除元素 本来应该判空和判断是否存满的条件都是&#xff1a;队头 队尾&#xff0c;但这样就没办法区分了&#xff0c;所以&#xff0c;就牺牲一个空间&#xff08;比如长度为10&#xff0c;但只能存9个&#xff09;&#xff0c;这…

auto的使用场景

auto的两面性 合理使用auto 不仅可以减少代码量, 也会大大提高代码的可读性. 但是事情总有它的两面性 如果滥用auto, 则会让代码失去可读性 推荐写法 这里推荐两种情况下使用auto 一眼就能看出声明变量的初始化类型的时候 比如迭代器的循环, 用例如下 #include <iostre…

利用autoDecoder工具在数据包加密+签名验证站点流畅测试

站点是个靶场 https://github.com/0ctDay/encrypt-decrypt-vuls 演示地址http://39.98.108.20:8085/ 不是仅登录位置暴力破解的那种场景&#xff0c;使用autoDecoder&#xff08;https://github.com/f0ng/autoDecoder&#xff09;的好处就是每个请求自动加解密&#xff0c;测…

关于ThinkPHP 5 框架开启自动搜索控制器 无法访问的问题坑

假如当前有一个登陆接口功能 因为后续会有不同版本的 登陆接口 这时候 我们可以在控制器中 新建文件夹 做区分 方便管理即 新建了一个 api 模块 文件路径是 api/controller/V1/Login 正常情况下 controller 目录下 是 控制器文件 login.php 文件&#xff0c;由于我们有多个…

Qt text-align和padding属性

1. text-align属性是用来设置文本的水平对齐方式。 text-align: center 文本将居中显示text-align: left 文本将左对齐显示text-align: right 文本将右对齐显示 2. 内边距padding: 内边距是元素内容与其边框之间的空间 padding-left: 10px; 距离内左边距10个像素点padding-r…