基础算法篇(3)(蓝桥杯常考点)-图论
前言
这期是蓝桥杯常考点的最后一章了,其中的dijkstra算法更是蓝桥杯中的高频考点
图的基本相关概念
有向图和无向图 自环和重边 稠密图和稀疏图
对于不带权的图,一条路径的路径长度是指该路径上各边权值的总和
对于带权的图,一条路径长度时指该路径上各个边权值得总和
顶点的度是指和它相关联的边的条数,由该顶点发出的边称为顶点的出度,到达该顶点的边称为顶点的入度
无向图中才有联通图和联通分量这些概念
考的时候:有些数据输入格式就是按图给的
(eg:u和v之间有一条长度为k的边)
如果没有说图没有重边和自环,一般默认测试点的图会有重边和自环
有向无环图可以搭配上动态规划用(eg:拓扑+动态规划)(在问最短路有几条时,常要用到动态规划)
图的存储
有两种方式:邻接矩阵和邻接表
1.邻接表的存储方式和树的孩子表示法一样,用vector数组和链式前向星都可以实现
2.邻接矩阵是用一个二维数组,其中edge[i][j]存储顶点i与顶点j之间的边的信息
邻接矩阵:
1.对于带权图而言,若顶点i和顶点j之间有边相连,则邻接矩阵中对应项存放着该边对应的权值若顶点i和顶点j之间不相连,则用无穷大(有时用其他)代表这两顶点间无边
2.对于不带权的图,可以创建一个二维的bool类型的数组,来标记顶点i和j之间有边相连
时间复杂度为:O(n平方),因此适合存稠密图
注意:邻接矩阵如果有重边,一般存其最小值
代码展示:int edges[N][N];//一般需要初始化,vector那个则不用for(int i = 1;i<=m;i++)
{int a,b,c;cin>>a>>b>>c;//a和b之间有一条边,权值为cedges[a][b] = c;//如果是无向边,需要反过来再存一下edges[b][a] = c;}
邻接表:
自己一般喜欢使用vector数组去存
如果存在边权的话,vector数组里面需要放结构体或者pair
pair自己喜欢第一个数据记录边的终点,第二个数据记录边权值
vector数组的下标表示边的起点代码展示:vector<pair<int,int>> edges[N];for(int i=1;i<=m;i++)
{int a,b,c;cin>>a>>b>>c;//a和b之间有一条边,权值为cedges[a].push_back{(b,c)};//如果是无向边,需要反过来再存一下edges[b].push_back{(a,c)};}
图的遍历
图的遍历有DFS和BFS,和树的遍历的实现方法一样
自己常用dfs来搞:
1.邻接矩阵:void dfs(int u)
{cout<<u<<endl;st[u] = true;for(int v =1;v<=n;v++){//如果存在u->v的边,并且没有遍历过if(edges[u][v]!=-1&&st[v])dfs(v);}}main函数里面有memset(edges,-1,sizeof edges);2.vector数组:void dfs(int u){cout<<u<<endl;st[u] = true;for(auto&t:edges[u]){//u->v的一条边,权值为wint v = t.first,w=t.second;if(!st[v]){ dfs[v];}}}
最小生成树
一般用普利姆(Prim)算法和克鲁斯卡尔(Kruskal)算法去构造最小生成树
最小生成树面向的是无向图,如果有向图有无向图返回的性质,也可以用此
Prim算法:
核心:不断加点
步骤:
1.从任意一点开始构造最小生成树(一般选1为起点,dist[1] = 0)
2.将距离该树权值最小且不在树中的顶点,加入到生成树中。(记得判断是否联通)然后更新与该点相连的点到生成树的最短距离(不要忘了考虑重边和自环!)
3.重复2操作n次,直到所有顶点都加入为此Kruskal算法:(运行时间和空间时间允许的话,建议用这个)
核心:不断加边
步骤:
1.所有边按照权值排序
2.每次选出权值最小且两端顶点不连通的一条边,直到所有顶点都联通
时间复杂度:m*logm(m是边数)
这个算法不用图,只用存边,用结构体存即可(也不算邻接表)
定理:最小生成树就是瓶颈生成树
瓶颈生成树:所有生成树中,最大的边权的值最小的那棵树
拓扑排序
拓扑排序的目标是将有向无环图中的所有结点排序
适用于有要完成了前置项才能走的点的图(AOV网)
(eg:一个摄像头能被砸毁的条件是该摄像头所在位置不被其他摄像头监视)
实现方法:
1.将图中所有入度为0的点,加入到队列中2.取出队头元素,删除与该点相连的边。如果删除之后的后继结点入度变为0,加入到队列中
3.重复2操作,直到图中没有点或者没有入度为0的点为止
需要搞个vectoredges[N]存N的后继
int in[N]存入度信息eg: edges[i].push_back(j);//i的后继为j
in[j]++;//统计入度信息例题: 洛谷 B3644 【模板】拓扑排序/家谱树
拓扑排序判断是否有环:
跑一遍拓扑排序,如果有结点没有进队,那么表明有环
单源最短路
概念:图中一个顶点到其他各顶点的最短路径
有向图,无向图都能用
常见版dijkstra算法:
流程:
1.创建一个长度为n的dist数组,其中dist[i]表示从起点到i结点的最短路
2.创建一个长度为n的bool数组st,其中st[i]表示i点是否已经确定了最短路
3.初始化:dist[i] = 0,其余结点的dist值为无穷大,表示还没有找到最短路
4.在所有没有确定最短路的点中,找出最短路长度最小的点u。打上确定最短路的标记,然后对u的出边进行松弛操作松弛操作:if(dist[u]+w<dist[v])dist[v] = dist[u]+w;堆优化版的dijkstra算法:
1.创建一个长度为n的dist数组,其中dist[i]表示从起点到i结点的最短路创建一个长度为n的bool数组st,其中st[i]表示i点是否已经确定了最短路创建一个小根堆,维护更新后的结点.(也就是需要确定最短路的结点)
eg:priority_queue<PII,vector<PII>,greater<PII>>heap
2.初始化:dist[i]=0,然后讲{0,s}加到堆里,其余结点的dist值为无穷大,表示还找到最短路
3.弹出堆顶元素,如果该元素已经标记过,就跳过;如果没有,打上标记,进行松弛操作bellman-ford算法(简称BF算法):
核心思想:不断尝试对图上的每一条边进行松弛,直到所有的点都无法松弛为止
1.创建一个长度为n的dist数组,其中dist[i]表示从起点到i结点的最短路
2.初始化:dist[i]=0,其余结点的dist值为无穷大,表示还没有找到最短路
3.每次都对所有的边进行一次松弛操作(一般按结点编号顺序来找边去松弛)
4.重复上述操作,直到所有边都不需要松弛为止
这个算法也不需要存图spfa算法:(本质是用队列对BF算法做优化)
1.创建一个长度为n的dist数组,其中dist[i]表示从起点到i结点的最短路创建一个长度为n的bool数组st,其中st[i]表示i点是否已经在队列中
2.初始化:标记dist[i]=0,同时1入队;其余结点的dist值无穷大,表示还没找到最短路
3.每次拿出队头元素u,去掉在队列中的标记,同时对u所有相连的点v进行松弛操作如果结点v被松弛,那就放进队列中
4.重复上述操作,直到队列中没有结点为止
例题:洛谷 P3385 【模板】负环1.BF判断负环:执行n轮松弛操作,如果第n轮还存在松弛操作,那么就有负环2.spfa算法判断负环:维护一个cnt数组记录从起点到该点所经过的边数,如果cnt[i]>=m,说明有负环
单源路算法总结:(n为结点个数,m为边数)
1.dijkstra算法:时间复杂度:O(n平方)
2.堆优化的dijkstra算法: 时间复杂度:O(m*logm,m为边数)
没有负边权的话用这俩
有负边权就用BF算法和spfa算法
3.BF算法:时间复杂度:nm
4.spfa算法:时间复杂度:km~nm(k要具体题去分析)
5.普通BFS:处理边权全部相同并且非负的单源最短路
6.01BFS:处理边权要么为0,要么为1的单元最短路
问最短路有几条的问题:
例题: 洛谷 P1144 最短路计数
1.这里的松弛操作和上面的有些不同:(要分情况了)dist[u]+w<dist[v]的话:f[v] = f[u]dist[u]+w=dist[v]的话f[v]+=f[u]
2.而且这里的BFS不能用st数组了,其他算法可以
一般做法使用dijkstra算法或者BFS(边权相等才可BFS这个方法)+动态规划
多源最短路
和搜索那里的多源最短路区分(那里是多个起点)
这里是分阶段求最短路(加点求,加点求)–用floyd算法解决
floyd算法适用于任何图,但是不能含负环
floyd算法:其本质是动态规划。其实就是分阶段,逐步更新出我们的最终结果
思路:
1.状态表示:
f[k][i][j]表示:
仅仅经过[1,k]这些点,结点i走到结点j的最短路径的长度
2.状态转移方程:
第一种情况,不选新来的点:f[k][i][j]=f[k-1][i][j]
第二种情况,选择新来的点:f[k][i][j]=f[k-1][i][j]+f[k-1][i][j]
取这两种的min
3.空间优化:可以优化掉第一维
4.初始化:
f[i][i]=0;
f[i][j]为初始状态下i到j的距离,如果没有边则为无穷
5.填表顺序:
一定要先枚举j,再枚举i和j例题: 洛谷 B3647 【模板】Floyd如果题目有限制加点的时机,那就把floyd算法里面的k那一层循环拆了改成判断条件即可
例题: 洛谷 P1119 灾后重建
无向图的最小环问题:
例题:洛谷 P6175 ⽆向图的最⼩环问题
floyd算法循环到k的时候,这个环的最小长度为f[i][j]+e[i][k]+e[k][j]核心部分:
for(int k =1;k<=n;k++)
{//最小环for(int i=1;i<k;i++)for(int j=i=1,j<k,j++)ret = min(ret,f[i][j]+e[i][k]+e[k][j]);//最短距离
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)f[i][j]=min(f[i][j],f[i][k]+f[k][j]);}
例题的跳转链接汇总
洛谷 B3644 【模板】拓扑排序/家谱树
洛谷 P3385 【模板】负环
洛谷 P1144 最短路计数
洛谷 B3647 【模板】Floyd
洛谷 P1119 灾后重建
洛谷 P6175 ⽆向图的最⼩环问题
相关文章:
基础算法篇(3)(蓝桥杯常考点)-图论
前言 这期是蓝桥杯常考点的最后一章了,其中的dijkstra算法更是蓝桥杯中的高频考点 图的基本相关概念 有向图和无向图 自环和重边 稠密图和稀疏图 对于不带权的图,一条路径的路径长度是指该路径上各边权值的总和 对于带权的图,一条路径长度时…...
git错误:fatal: detected dubious ownership in repository at xxxxxx
1、报错说明 这个错误通常是由于Git仓库目录的拥有者或权限问题引起的。Git检测到仓库目录的所有权可能存在不一致或不安全的情况。 通常导致此报错的可能原因: (1)文件或目录的拥有者不一致: 仓库目录中的某些文件或子目录可能…...
【Linux】进程间通信(IPC)-- 无名管道、命名管道
IPC机制 实现进程间通信 在多个进程间传输数据或共享信息的机制。 数据交换,共享资源,进程同步,消息传递。 IPC实现原理:通信进程能够访问相同的内存区域。 方法: 管道:无名管道pipe、命名管道FIFO S…...
每日一题-力扣-2278. 字母在字符串中的百分比 0331
字母在字符串中的百分比求解方案 | 力扣 2278 题解 问题描述 给定一个字符串 s 和一个字母 letter,我们需要计算 letter 在 s 中出现的百分比,并将结果向下取整。例如,如果字符串是 "foobar",字母是 "o"&…...
【分布式】深入剖析 Sentinel 限流:原理、实现
在当今分布式系统盛行的时代,流量的剧增给系统稳定性带来了巨大挑战。Sentinel 作为一款强大的流量控制组件,在保障系统平稳运行方面发挥着关键作用。本文将深入探讨 Sentinel 限流的原理、实现方案以及其优缺点,助力开发者更好地运用这一工具…...
[leetcode]2492. 两个城市间路径的最小分数(并查集 排序后建边)
题目链接 题意 给定一个 n n n个点 m m m条边的无向图 每条边有边权 求1-n的路径中最小的边权是多少 每条路可以重复走 思路 把边按边权降序排序 用并查集维护连通性 遍历每条边 每次合并边的起点和终点 如果1和n联通 并且这条边在1和n的这个连通块中 就对ans取min Code…...
关于CodeJava的学习笔记——11
一、GUI 1、最简单的GUI 只有一个按钮的GUI import java.awt.*; import javax.swing.*; public class SimpleGUI{JFrame frame;Button bt;public SimpleGUI(){frame new JFrame("标题栏内容");bt new Button("点我啊");frame.add(bt);frame.setSize(8…...
首个物业plus系列展 2025上海国际智慧物业博览会开幕
AI赋能服务升级!首个“物业plus”系列展 2025上海国际智慧物业博览会盛大开幕 3月31日,2025上海国际智慧物业博览会(简称“上海物博会”)在上海新国际博览中心N4馆隆重开幕。本届展会由广州旭杨国际展览有限公司主办,…...
嵌入式八股文学习——虚函数相关知识学习
虚函数 什么是虚函数?虚函数示例解析代码解析: 使用虚函数的注意事项1. 虚函数的声明与定义2. 派生类中的虚函数 哪些函数不能声明为虚函数1. 普通函数(非成员函数)2. 构造函数3. 内联成员函数4. 静态成员函数5. 友元函数总结 纯虚…...
rk3586开发版新增系统调用(Android13)
一、前言 最近想学一下kernel和hal,所以买了一块板子,带了个摄像头和屏幕,1100,学习投资了。这个Android内核定一个系统调用感觉是真的麻烦,主要是有一层bionic C,一开始不熟悉的时候还是花了点时间去配置。 二、kernel修改 include/uapi/asm-generic…...
OCR第三个方案:PP-OCRv4的初步探索
一、PP-OCR历史简要回顾 先请出PP-OCR官网,理解上有出入的,以官网为准。 1.1 PP-OCR系列历史 PP-OCRv1(2020):首创3.5M超轻量模型,奠定两阶段架构基础(检测方向分类识别)PP-OCRv2…...
物联网开发项目:AS608+ESP32S3+Vue构建指纹识别系统(二)——ESP32部分
一、前言 接着上一篇文章介绍的关于AS608模块的介绍以及关于指纹特征库的提取与导入分析,如果亲自上手了的话,那么对于Arduino IDE和AS608的基本操作已经熟悉了。 在这一个月之中,抛开中途有事耽误了,终于是基本上完成了我们整个项…...
程序化广告行业(46/89):竞价结算规则、底价策略与内部排名解析
程序化广告行业(46/89):竞价结算规则、底价策略与内部排名解析 大家好!在之前的几篇博客中,我们已经深入探讨了程序化广告的多个重要方面,从基础概念到实际操作流程。我写这些博客的目的,就是希…...
ICLR 2025 Spotlight:让机器人实现「自主进化」,蚂蚁数科、清华提出具身协同框架 BodyGen
最近,全球 AI 和机器学习顶会 ICLR 2025 公布了论文录取结果:由蚂蚁数科与清华大学联合团队提出的全新具身协同框架 BodyGen 成功入选 Spotlight(聚光灯/特别关注)论文。 论文出自蚂蚁数科与清华大学兴军亮老师团队合作的科研项目…...
第十九章:Python-pyttsx3 库实现文本转语音功能
前言 在开发语音交互应用或需要文本转语音功能的项目时,pyttsx3 是一个非常实用的 Python 库。它支持离线语音合成,无需联网即可将文本转换为语音。本文将详细介绍 pyttsx3 的功能、用法以及常见问题的解决方法,并通过示例代码帮助你快速上手…...
Unity 2022.3.x部分Android设备播放视频黑屏问题
Android平台视频兼容性问题很多…类似的黑屏问题真的很头大,总结一些常见问题: 1. 视频文件不支持压缩 如果使用AssetBundle加载视频,这个AssetBundle压缩格式要选None。有人可能会说最新版Unity已经支持bundle压缩下播放视频,稳…...
vLLM 部署 openai whisper 模型实现语音转文字
vLLM 部署 openai whisper 模型实现语音转文字 1. 安装 vLLM2. 启动 openai whisper 模型 1. 安装 vLLM pip install vllm vllm[audio] --pre --extra-index-url https://wheels.vllm.ai/nightly --upgrade2. 启动 openai whisper 模型 CUDA_VISIBLE_DEVICES0 \ VLLM_WORKER_…...
【Zabbix技术系列文章】第④篇——Zabbix 数据可视化
在当今数字化运维时代,面对海量的监控数据,如何从中快速获取有价值的信息至关重要。Zabbix 的数据可视化功能为我们提供了直观、高效的解决方案,它能将复杂的监控数据转化为清晰易懂的图表和仪表盘,助力运维人员迅速发现问题、分析…...
表格数据导出为Excel
环境及插件配置:(理论上vue2应该也可以使用,没有试验过) "vue": "^3.2.36", "webpack": "^5.94.0", "webpack-cli": "^5.1.4", "file-saver": "^2.…...
Faster-Whisper —— 为语音识别加速的利器
Faster-Whisper —— 为语音识别加速的利器 在语音识别技术迅速发展的今天,OpenAI 的 Whisper 模型因其强大的多语言识别能力和优异的准确率而受到广泛关注。然而,高精度模型往往伴随着高昂的计算开销和较长的推理时间,这对于需要实时或大规…...
SvelteKit 最新中文文档教程(16)—— Service workers
前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …...
Flutter项目之构建打包分析
目录: 1、准备部分2、构建Android包2.1、配置修改部分2.2、编译打包 3、构建ios包3.1、配置修改部分3.2、编译打包 1、准备部分 2、构建Android包 2.1、配置修改部分 2.2、编译打包 执行flutter build apk命令进行打包。 3、构建ios包 3.1、配置修改部分 3.2、编译…...
24、网络编程基础概念
网络编程基础概念 网络结构模式MAC地址IP地址子网掩码端口网络模型协议网络通信的过程(封装与解封装) 网络结构模式 C/S结构,由客户机和服务器两部分组成,如QQ、英雄联盟 B/S结构,通过浏览器与服务器进程交互…...
Mentalab Explore Pro携手 Wearanize + 数据集,推动睡眠科学研究
在神经科学和睡眠研究的领域,精确监测大脑活动是获取深入见解的关键。传统多导睡眠监测(PSG)设备虽然提供了详尽的数据,但其操作的复杂性和成本限制了其在更广泛场景中的应用。可穿戴技术的兴起提供了一种新的数据收集方式&#x…...
基于 RK3588 的 YOLO 多线程推理多级硬件加速引擎框架设计(代码框架和实现细节)
一、前言 接续上一篇文章,这个部分主要分析代码框架的实现细节和设计理念。 基于RK3588的YOLO多线程推理多级硬件加速引擎框架设计(项目总览和加速效果)-CSDN博客https://blog.csdn.net/plmm__/article/details/146542002?spm1001.2014.300…...
element-ui图片查看器
element-ui图片查看器 调用案例: <el-image-viewerv-if"showViewer":on-close"()>{showViewerfalse}":url-list"imgList" />export default {components: {Banner,el-image-viewer:()>import(element-ui/packages/image/…...
VoIP技术及其与UDP的关系详解
随着互联网的飞速发展,基于IP的语音通信技术(Voice over Internet Protocol,简称VoIP)已经成为现代通信的重要支柱。从Skype到Zoom,从企业电话系统到智能音箱,VoIP以其低成本、高灵活性和强大的扩展性逐渐取…...
Java中如何保证高并发的数据安全
在Java中保证高并发的数据安全,可以从以下几个方面入手: 1. 锁机制 • synchronized:Java内置的锁机制,用于同步方法或代码块,简单易用,但灵活性较低。 • ReentrantLock:提供了比synchronize…...
DeepSeek原生稀疏注意力(Native Sparse Attention, NSA)算法介绍
李升伟 整理 DeepSeek 提出的原生稀疏注意力(Native Sparse Attention, NSA)算法是一种创新的注意力机制,旨在解决大语言模型(LLM)在处理长序列数据时的计算瓶颈问题。NSA 通过结合算法优化和硬件对齐设计,…...
Java基础知识总结(1.8)——Java 注解(持续更新)
更新时间:2025-03-31 Web后端专栏:CSDN专栏——理论-Web后端技术博客总目录:计算机技术系列博客——目录页 8.1 注解的概念 8.1.1 定义与作用 Java注解(Annotation)是Java语言自JDK1.5版本引入的核心特性࿰…...
