当前位置: 首页 > news >正文

NO.91十六届蓝桥杯备战|图论基础-图的存储和遍历|邻接矩阵|vector|链式前向星(C++)

图的基本概念

图的定义

图G是由顶点集V和边集E组成,记为G = (V, E),其中V(G)表⽰图G中顶点的有限⾮空集;E(G)表⽰图G中顶点之间的关系(边)集合。若 V = { v 1 , v 2 , … , v n } V = \left\{ v_{1},v_{2},\dots,v_{n} \right\} V={v1,v2,,vn},则⽤ ∣ V ∣ |V| V
⽰图G中顶点的个数,也称图G的阶, E = ( u , v ) ∣ u ∈ V , v ∈ V E = {(u,v)|u \in V, v \in V} E=(u,v)uV,vV,⽤ ∣ E ∣ |E| E表⽰图G中边的条数。
图是较线性表和树更为复杂的数据结构。

  • 线性表中,除第⼀个和最后⼀个元素外,每个元素只有⼀个唯⼀的前驱和唯⼀的后继结点,元素和元素之间是⼀对⼀的关系;
  • 在树形结构中,数据元素之间有着明显的层次关系,每个元素有唯⼀的双亲,但可能有多个孩⼦,元素和元素之间是⼀对多的关系;
  • ⽽图形结构中,元素和元素之间的关系更加复杂,结点和结点之间的关系是任意的,任意两个结点之间都可能相关,图中元素和元素之间是多对多的关系
    ![[Pasted image 20250411210928.png]]
有向图和⽆向图

图根据边的类型,可以分为⽆向图和有向图
![[Pasted image 20250411211513.png]]

在图相关的算法中,我们可以将⽆向图中的边看成两条⽅向相反的有向边,从⽽将⽆向图转化为有向图
![[Pasted image 20250411211622.png]]

简单图与多重图

⾃环:⾃⼰指向⾃⼰的⼀条边
![[Pasted image 20250411211640.png]]

重边:图中存在两个或两个以上完全相同的边
![[Pasted image 20250411211811.png]]

简单图:若图中没有重边和⾃环,为简单图。
多重图:若图中存在重边或⾃环,为多重图。
![[Pasted image 20250411211832.png]]

稠密图和稀疏图

有很少条边(如e < nlog2 n )的图称为稀疏图,反之称为稠密图
![[Pasted image 20250411211857.png]]

顶点的度

顶点v的度是指与它相关联的边的条数,记作deg(v)。由该顶点发出的边称为顶点的出度,到达该顶点的边称为顶点的⼊度。

  • ⽆向图中,顶点的度等于该顶点的⼊度(indev)和出度(outdev),即deg(v)=indeg(v)=outdeg(v)。
  • 有向图中,顶点的度等于该顶点的⼊度与出度之和,其中顶点v的⼊度indeg(v)是以v为终点的有向边的条数,顶点v的出度outdeg(v)是以v为起始点的有向边的条数,deg(v)=indeg(v)+outdeg(v)
    ![[Pasted image 20250411212011.png]]
路径

在图G=(V,E)中,若从顶点 v i v_{i} vi出发,沿⼀些边经过某些顶点 v p 1 , v p 2 , … , v p m v_{p1},v_{p2},\dots,v_{pm} vp1,vp2,,vpm,到达顶点 v j v_{j} vj。则称顶点序列 ( v i , v p 1 , v p 2 , … , v p m , v j ) (v_{i},v_{p1},v_{p2},\dots,v_{pm},v_{j}) (vi,vp1,vp2,,vpm,vj)为从顶点 v i v_{i} vi到顶点 v j v_{j} vj的路径。
注意:两个顶点间的路径可能不唯⼀
![[Pasted image 20250411212248.png]]

简单路径与回路

若路径上各顶点 v 1 , v 2 , … , v m v_{1},v_{2},\dots,v_{m} v1,v2,,vm均不重复,则称这样的路径为简单路径。若路径上第⼀个顶点 v 1 v_{1} v1和最后⼀个顶点 v m v_{m} vm相同,则称这样的路径为回路或环
![[Pasted image 20250411212403.png]]

路径⻓度和带权路径⻓度

某些图的边具有与它相关的数值,称其为该边的权值。这些权值可以表⽰两个顶点间的距离、花费的代价、所需的时间等。⼀般将该种带权图称为⽹络
![[Pasted image 20250411212509.png]]

对于不带权的图,⼀条路径的路径⻓度是指该路径上的边的条数。
对于带权的图,⼀条路径的路径⻓度是指该路径上各个边权值的总和。
![[Pasted image 20250411212521.png]]

⼦图

设图 G = { V , E } G = \left\{ V, E\right\} G={V,E}和图 G ′ = { V ′ , E ′ } G' = \left\{ V',E' \right\} G={V,E},若 V ′ ∈ V V'\in V VV E ′ ∈ E E'\in E EE,则称 G ′ G' G G G G的⼦图。若有 V ( G ′ ) = V ( G ) V(G')=V(G) V(G)=V(G)的⼦图 G ′ G' G,则称 G ′ G' G G G G的⽣成⼦图。
相当于就是在原来图的基础上,拿出来⼀些顶点和边,组成⼀个新的图。但是要注意,拿出来的点和边要能构成⼀个图才⾏
![[Pasted image 20250411212748.png]]

G1_1和G1_2为⽆向图G1的⼦图,G1_1为G1的⽣成⼦图。
G2_1和G2_2为有向图G2的⼦图,G2_1为G2的⽣成⼦图。

连通图与连通分量

在⽆向图中,若从顶点 v 1 v_{1} v1到顶点 v 2 v_{2} v2有路径,则称顶点 v 1 v_{1} v1与顶点 v 2 v_{2} v2是连通的。如果图G中任意⼀对顶点都是连通的,则图G称为连通图,否则称为⾮连通图。

  • 假设⼀个图有n个顶点,如果边数⼩于n-1,那么此图⼀定是⾮连通图。
  • 极⼤联通⼦图:⽆向图中,拿出⼀个⼦图,这个⼦图包含尽可能多的点和边。
  • 连通分量:⽆向图中的极⼤连通⼦图称为连通分量
    ![[Pasted image 20250411212932.png]]
⽣成树

连通图的⽣成树是包含图中全部顶点的⼀个极⼩连通⼦图。若图中顶点数为n,则它的⽣成树含有n-1条边。对⽣成树⽽⾔,若砍去⼀条边,则会变成⾮连通图,若加上⼀条边则会形成⼀个回路
![[Pasted image 20250411213241.png]]

图的存储和遍历

图的存储有两种:邻接矩阵和邻接表:

  • 其中,邻接表的存储⽅式与树的孩⼦表⽰法完全⼀样。因此,⽤vector数组以及链式前向星就能实现。
  • ⽽邻接矩阵就是⽤⼀个⼆维数组,其中edges[i][j]存储顶点 i 与顶点 j 之间,边的信息。
    图的遍历分两种:DFS和BFS,和树的遍历⽅式以及实现⽅式完全⼀样。因此,可以仿照树这个数据结构来学习
邻接矩阵

邻接矩阵,指⽤⼀个矩阵(即⼆维数组)存储图中边的信息(即各个顶点之间的邻接关系),存储顶点之间邻接关系的矩阵称为邻接矩阵。
对于带权图⽽⾔,若顶点 v i v_{i} vi v j v_{j} vj之间有边相连,则邻接矩阵中对应项存放着该边对应的权值,若顶点 v i v_{i} vi v j v_{j} vj不相连,则⽤ ∞ \infty 来代表这两个顶点之间不存在边。
对于不带权的图,可以创建⼀个⼆维的bool类型的数组,来标记顶点vi 和vj 之间有边相连
![[Pasted image 20250411214010.png]]

矩阵中元素个数为nxn,即空间复杂度为O(n^2) ,n为顶点个数,和实际边的条数⽆关,适合存储稠密图

#include <iostream>  
#include <cstring>  
using namespace std;  
const int N = 1010;  
int n, m;  
int edges[N][N];  
int main()  
{  memset(edges, -1, sizeof edges);  cin >> n >> m; // 读⼊结点个数以及边的个数  for(int i = 1; i <= m; i++)  {  int a, b, c; cin >> a >> b >> c;  // a - b 有⼀条边,权值为 c  edges[a][b] = c;  // 如果是⽆向边,需要反过来再存⼀下  edges[b][a] = c;  }return 0;  
}
vector数组

和树的存储⼀模⼀样,只不过如果存在边权的话,我们的vector数组⾥⾯放⼀个结构体或者是pair即可。

#include <iostream>  
#include <vector>  using namespace std;  
typedef pair<int, int> PII;  
const int N = 1e5 + 10;  
int n, m;  
vector<PII> edges[N];  int main()  
{  cin >> n >> m; // 读⼊结点个数以及边的个数  for(int i = 1; i <= m; i++)  {  int a, b, c; cin >> a >> b >> c;  // a 和 b 之间有⼀条边,权值为 c  edges[a].push_back({b, c});  // 如果是⽆向边,需要反过来再存⼀下  edges[b].push_back({a, c});  }  return 0;  
}
链式前向星

和树的存储⼀模⼀样,只不过如果存在边权的话,我们多创建⼀维数组,⽤来存储边的权值即可

#include <iostream>  
using namespace std;  
const int N = 1e5 + 10;  
// 链式前向星  
int h[N], e[N * 2], ne[N * 2], w[N * 2], id;  
int n, m;  
// 其实就是把 b 头插到 a 所在的链表后⾯  
void add(int a, int b, int c)  
{  id++;  e[id] = b;  w[id] = c; // 多存⼀个权值信息  ne[id] = h[a];  h[a] = id;  
}  
int main()  
{  cin >> n >> m; // 读⼊结点个数以及边的个数  for(int i = 1; i <= m; i++)  {  int a, b, c; cin >> a >> b >> c;  // a 和 b 之间有⼀条边,权值为 c  add(a, b, c); add(b, a, c);  }  return 0;  
}
DFS

和树的遍历⽅式⼀模⼀样,⼀条路⾛到⿊

  1. ⽤邻接矩阵的⽅式存储
#include <iostream>  
#include <cstring>  
#include <queue>  
using namespace std;  
const int N = 1010;  
int n, m;  
int edges[N][N];  
bool st[N]; // 标记哪些点已经访问过  
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);  }  }  
}  int main()  
{  memset(edges, -1, sizeof edges);  cin >> n >> m; // 读⼊结点个数以及边的个数  for(int i = 1; i <= m; i++)  {  int a, b, c; cin >> a >> b >> c;  // a - b 有⼀条边,权值为 c  edges[a][b] = c;  // 如果是⽆向边,需要反过来再存⼀下  edges[b][a] = c;  }return 0;  
}
  1. ⽤vector数组的⽅式存储
#include <iostream>  
#include <vector>  
#include <queue>  
using namespace std;  
typedef pair<int, int> PII;  
const int N = 1e5 + 10;  
int n, m;  
vector<PII> edges[N];  
bool st[N]; // 标记哪些点已经访问过  
void dfs(int u)  
{  cout << u << endl;  st[u] = true;  // 遍历所有孩⼦  for(auto& t : edges[u])  {  // u->v 的⼀条边,权值为 w  int v = t.first, w = t.second;  if(!st[v])  {  dfs(v);  }  }  
}  int main()  
{  cin >> n >> m; // 读⼊结点个数以及边的个数  for(int i = 1; i <= m; i++){  int a, b, c; cin >> a >> b >> c;  // a 和 b 之间有⼀条边,权值为 c  edges[a].push_back({b, c});  // 如果是⽆向边,需要反过来再存⼀下  edges[b].push_back({a, c});  }  return 0;  
}
  1. ⽤链式前向星的⽅式存储
#include <iostream>  
#include <queue>  
using namespace std;  
const int N = 1e5 + 10;  
// 链式前向星  
int h[N], e[N * 2], ne[N * 2], w[N * 2], id;  
int n, m;  
// 其实就是把 b 头插到 a 所在的链表后⾯  
void add(int a, int b, int c)  
{  id++;  e[id] = b;  w[id] = c; // 多存⼀个权值信息  ne[id] = h[a];  h[a] = id;  
}  bool st[N];  void dfs(int u)  
{  cout << u << endl;  st[u] = true;// 遍历所有的孩⼦  for(int i = h[u]; i; i = ne[i])  {  // u->v 的⼀条边  int v = e[i];  if(!st[v])  {  dfs(v);  }  }  
}  
int main()  
{  cin >> n >> m; // 读⼊结点个数以及边的个数  for(int i = 1; i <= m; i++)  {  int a, b, c; cin >> a >> b >> c;  // a 和 b 之间有⼀条边,权值为 c  add(a, b, c); add(b, a, c);  }  return 0;  
}
BFS
  1. ⽤邻接矩阵的⽅式存储
#include <iostream>  
#include <cstring>  
#include <queue>  
using namespace std;  
const int N = 1010;  
int n, m;  
int edges[N][N];
bool st[N]; // 标记哪些点已经访问过  
void bfs(int u)  
{  queue<int> q;  q.push(u);  st[u] = true;  while(q.size())  {  auto a = q.front(); q.pop();  cout << a << endl;  for(int b = 1; b <= n; b++)  {  if(edges[a][b] != -1 && !st[b])  {  q.push(b);  st[b] = true;  }  }  }  
}  int main()  
{  memset(edges, -1, sizeof edges);  cin >> n >> m; // 读⼊结点个数以及边的个数  for(int i = 1; i <= m; i++)  {  int a, b, c; cin >> a >> b >> c;  // a - b 有⼀条边,权值为 c  edges[a][b] = c;  // 如果是⽆向边,需要反过来再存⼀下  edges[b][a] = c;  }  return 0;  
}
  1. ⽤vector数组的⽅式存储
#include <iostream>  
#include <vector>  
#include <queue>  
using namespace std;  
typedef pair<int, int> PII;  
const int N = 1e5 + 10;  
int n, m;  
vector<PII> edges[N];  
bool st[N]; // 标记哪些点已经访问过  
void bfs(int u)  
{  queue<int> q;  q.push(u);  st[u] = true;  while(q.size())  {  auto a = q.front(); q.pop();  cout << a << endl;  for(auto& t : edges[a])  {  int b = t.first, c = t.second;  if(!st[b])  {  q.push(b);  st[b] = true;  }  }  }  
}  int main()  
{  cin >> n >> m; // 读⼊结点个数以及边的个数  for(int i = 1; i <= m; i++)  {  int a, b, c; cin >> a >> b >> c;// a 和 b 之间有⼀条边,权值为 c  edges[a].push_back({b, c});  // 如果是⽆向边,需要反过来再存⼀下  edges[b].push_back({a, c});  }  return 0;  
}
  1. ⽤链式前向星的⽅式存储
#include <iostream>  
#include <queue>  
using namespace std;  
const int N = 1e5 + 10;  
// 链式前向星  
int h[N], e[N * 2], ne[N * 2], w[N * 2], id;  
int n, m;  
// 其实就是把 b 头插到 a 所在的链表后⾯  
void add(int a, int b, int c)  
{  id++;  e[id] = b;  w[id] = c; // 多存⼀个权值信息  ne[id] = h[a];  h[a] = id;  
}  bool st[N];  void bfs(int u)  
{  queue<int> q;  q.push(u);  st[u] = true;  while(q.size(){  auto a = q.front(); q.pop();  cout << a << endl;  for(int i = h[a]; i; i = ne[i])  {  int b = e[i], c = w[i];  if(!st[b])  {  q.push(b);  st[b] = true;  }  }  }  
}  
int main()  
{  cin >> n >> m; // 读⼊结点个数以及边的个数  for(int i = 1; i <= m; i++)  {  int a, b, c; cin >> a >> b >> c;  // a 和 b 之间有⼀条边,权值为 c  add(a, b, c); add(b, a, c);  }  return 0;  
}

相关文章:

NO.91十六届蓝桥杯备战|图论基础-图的存储和遍历|邻接矩阵|vector|链式前向星(C++)

图的基本概念 图的定义 图G是由顶点集V和边集E组成&#xff0c;记为G (V, E)&#xff0c;其中V(G)表⽰图G中顶点的有限⾮空集&#xff1b;E(G)表⽰图G中顶点之间的关系&#xff08;边&#xff09;集合。若 V { v 1 , v 2 , … , v n } V \left\{ v_{1},v_{2},\dots,v_{n} …...

树、二叉树、二叉查找树、AVL 树及红黑树的深入解析

树、二叉树、二叉查找树、AVL 树及红黑树的深入解析 1 .树的基本知识1.1 树的定义1.2 基本术语和概念1.3 常见树的结构1.4 树的遍历&#xff08;取决于什么时候访问根节点&#xff09; 2 二叉树2.1 二叉树的定义2.2二叉树与度为2的树的区别2.3二叉树的性质2.4 二叉树分类 3 红黑…...

BUUCTF-web刷题篇(21)

30.hark world 判断注入类型&#xff1a; 输入1报错提示bool&#xff08;false&#xff09;可知是字符型的布尔注入&#xff08;盲注&#xff09; 尝试万能密码 1 or 11 已检测SQL注入&#xff0c;猜测某些关键词或者字符被过滤。 使用FUZZ字典爆破...

Linux 网络基础知识总结

Linux 网络基础知识总结 1. 计算机网络体系结构 • OSI七层模型 由国际化标准组织&#xff08;ISO&#xff09;制定&#xff0c;将网络通信分为七层&#xff1a; • 物理层&#xff1a;比特流传输&#xff08;如网线、光纤&#xff09;。 • 数据链路层&#xff1a;帧传输&am…...

Day 8 上篇:深入理解 Linux 驱动模型中的平台驱动与总线驱动

在 Linux 内核驱动模型中&#xff0c;设备与驱动的组织方式不是随意堆砌&#xff0c;而是基于清晰的分类逻辑进行架构设计的。最核心的架构基础是“设备模型”&#xff08;Device Model&#xff09;&#xff0c;而在此模型之上&#xff0c;各类驱动通过“平台驱动模型”与“总线…...

如何启动spark

解决&#xff1a;spark的bin目录下&#xff0c;无法启动spark问题 [roothadoop7 sbin]# ./start-all.sh ./start-all.sh:行29: /root/install/spark-2.4.0-bin-hadoop2.7/sbin/spark-config.sh: 没有那个文件或目录 ./start-all.sh:行32: /root/install/spark-2.4.0-bin-hadoo…...

Java网络编程干货

1.网络编程是什么 了解 在Java语言中&#xff0c;我们可以使用java.net包下的技术轻松开发出常见的网络应用程序&#xff0c;从而把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统&#x…...

Java实现安卓手机模拟操作

文章目录 第一部分&#xff1a;安卓模拟操作基础1.1 安卓输入系统概述1.1.1 输入事件传递机制1.1.2 输入事件类型 1.2 模拟操作的核心类1.2.1 Instrumentation类1.2.2 KeyEvent类1.2.3 MotionEvent类 1.3 权限要求1.3.1 普通权限1.3.2 特殊权限 第二部分&#xff1a;基础模拟操…...

一文讲清楚PLC、运动控制卡、运动控制器

随着工业技术的发展&#xff0c;工业机器人应用越来越广泛&#xff0c;PLC也不再是简单的可编程逻辑控制器&#xff0c;各个品牌厂家都推出了自己的运动控制型PLC&#xff0c;来实现一些运动控制功能&#xff0c;与此同时&#xff0c;运动控制卡及运动控制器也在如火如荼地发展…...

蓝桥杯备战

#include<bits/stdc.h> using namespace std; int main(){ios::sync_with_stdio(false);cin.tie(0);return 0; } 输入输出加速 ios::sync_with_stdio(false) 作用&#xff1a; 禁用 C 和 C 标准流的同步&#xff0c;使 cin/cout 速度接近 scanf/printf。 适用性&#xff…...

python保留关键字详解

一、什么是保留关键字&#xff1f; 保留关键字是Python语言中具有特殊含义和功能的词汇&#xff0c;这些词汇构成了Python的语法基础。它们不可被重新定义或用作变量名、函数名等标识符&#xff0c;在代码中承担着控制程序逻辑、定义数据结构等重要职责。 二、查看保留关键字…...

NLP中的“触发器”形式

在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;触发器的设计更加依赖于文本特征&#xff0c;而非视觉特征。以下是NLP中常见的触发器类型及其实现方式&#xff1a; 1. 特定词汇或短语 定义&#xff1a;在文本中插入特定的单词、短语或符号。示例&#xff1a; 罕见…...

uView修改样式(持续更新)

场景 通过样式穿透修改uView2.0组件样式&#xff0c;用于app 注意版本不一样方法可能不同 实现 通用 .uni-body{line-height: 0; }u-input ::v-deep .u-input{height: 20.51rpx !important;padding: 0 6.59rpx !important; } ::v-deep .uni-input-input{height:50%;font-s…...

使用 Datadog 和 Slack Alerts 监控 AWS EC2

监控是大多数 IT 专业人员的关键职责之一。如果您最近正在寻找新工作&#xff0c;您可能已经注意到“监控”一词几乎出现在许多组织发布的每份职位描述中。 您可以找到各种监控工具&#xff0c;它们提供一些卓越的功能来简化您的工程工作。然而&#xff0c;Datadog 是大多数组…...

grafana/loki 部署搜集 k8s 集群日志

grafana/loki 和 grafana/loki-stack 的区别 ​Grafana 提供了多个 Helm Chart 用于在 Kubernetes 集群中部署 Loki 及相关组件,其中主要包括 grafana/loki 和 grafana/loki-stack。​它们的主要区别如下:​ 1.grafana/loki Helm Chart: 专注于 Loki 部署: 该 Chart 专门…...

【ESP32S3】GATT Server service table传送数据到调试助手

前言 在初步学习esp32蓝牙的过程中&#xff0c;借鉴了官方的GATT Server Service Table Example&#xff0c;可以在readme中看到&#xff0c;此demo是采用低功耗蓝牙的通用属性服务器来创建订阅服务和特性。如果你接触过MQTT&#xff0c;你会发现GATT Server这一特性和MQTT的订…...

《Vue Router实战教程》5.嵌套路由

欢迎观看《Vue Router 实战&#xff08;第4版&#xff09;》视频课程 嵌套路由 一些应用程序的 UI 由多层嵌套的组件组成。在这种情况下&#xff0c;URL 的片段通常对应于特定的嵌套组件结构&#xff0c;例如&#xff1a; 通过 Vue Router&#xff0c;你可以使用嵌套路由配置…...

小白学习java第12天:IO流之转换流

我们可能会遇到这样情况就是&#xff1a;你在读取那个文件编码类型是GBK&#xff0c;而是进行读取的的时候使用的UTF-8&#xff0c;这就会导致乱码&#xff0c;因为你没办法保证别人是用什么类型进行编写的&#xff0c;因此我们就需要转换流进行处理这种情况&#xff01; 下面…...

BERT - 直接调用transformers.BertModel, BertTokenizerAPI不进行任何微调

本节代码将使用 transformers 库加载预训练的BERT模型和分词器&#xff08;Tokenizer&#xff09;&#xff0c;并处理文本输入。 1. 加载预训练模型和分词器 from transformers import BertTokenizer, BertModelmodel_path "/Users/azen/Desktop/llm/models/bert-base-…...

如何在 Spring Boot 项目中使用 MyBatis 进行批量操作以提升性能?

MyBatis 提供了 ExecutorType.BATCH 类型&#xff0c;允许将多个 SQL 语句进行组合&#xff0c;最后统一执行&#xff0c;从而减少数据库的访问频率&#xff0c;提升性能。 以下是如何在 Spring Boot 项目中使用 MyBatis 进行批量操作的关键点&#xff1a; 1. 配置 MyBatis 使…...

传统门店VS智慧门店:电能物联网平台在连锁行业的节能应用

前言 随着连锁零售行业门店的规模化发展&#xff0c;能源消耗成为企业成本管控与可持续发展的重要课题。在当今快节奏的商业环境中&#xff0c;连锁门店的管理和运营变得越来越具有挑战性。能源数据是连锁门店的管理中重要组成部分&#xff0c;为了提高门店的能源利用效率和管…...

[ctfshow web入门] RCE 或(or)、异或(xor)、非(not)绕过

代码 这是一个python语言的&#xff0c;使用或(or)、异或(xor)、非(not)防火墙 这将根据命令提供加密后的指令&#xff0c;用法 rce_xor(list_cmd)、rce_or(list_cmd)、rce_not(list_cmd) 用来生成加密后的指令&#xff0c;这个指令是类如下面这样的&#xff0c;这些指令可以用…...

C++ 虚函数:深入理解多态的核心机制

C 虚函数&#xff1a;深入理解多态的核心机制 在 C 里&#xff0c;虚函数是实现 多态&#xff08;Polymorphism&#xff09; 的关键机制之一。透彻理解虚函数的概念、实现方式以及使用场景&#xff0c;对编写高效且可扩展的 C 代码起着至关重要的作用。本文会详细介绍 C 虚函数…...

速盾:高防CDN节点对收录有影响吗?

引言 搜索引擎收录是网站运营中至关重要的环节&#xff0c;它直接影响着网站的曝光度和流量。近年来&#xff0c;随着网络安全威胁的增加&#xff0c;许多企业开始采用高防CDN&#xff08;内容分发网络&#xff09;来保护其网站免受DDoS攻击和其他形式的网络攻击。然而&#x…...

按规则批量修改文件扩展名、删除扩展名或添加扩展名

文件的扩展名是多种多样的&#xff0c;有些不同文件的扩展名之间相互是可以直接转换的。我们工作当中最常见的就是 doc 与 docx、xls 与 xlsx、jpg 与 jpeg、html 与 htm 等等&#xff0c;这些格式在大部分场景下都是可以相互转换 能直接兼容的。我们今天要介绍的就是如何按照一…...

在Java项目中,引入【全局异常处理器】

目录 一.为什么引入全局异常处理器&#xff08;目前项目碰到了什么问题&#xff09;&#xff1f; 1.问题描述 2.与预期的差别 3.解决方案 二.解决上述问题 1.定义【业务异常类】 2.在serviceImpl层&#xff0c;手动抛出【违反唯一性约束】这个异常 3.定义【全局异常处理…...

计算机网络-TCP协议详解

TCP协议详解 2. TCP协议详解2.1 TCP协议概述2.1.1 TCP的历史背景2.1.2 TCP的设计目标2.1.3 TCP的基本特性2.1.4 TCP与其他传输协议的比较2.1.5 TCP的应用场景 2.2 TCP头部结构2.2.1 TCP头部格式2.2.2 TCP头部字段详解源端口号和目的端口号&#xff08;各16位&#xff09;序列号…...

[蓝桥杯 2023 省 A] 平方差

P9231 [蓝桥杯 2023 省 A] 平方差 题目描述 给定 L , R L,R L,R&#xff0c;问 L ≤ x ≤ R L \leq x \leq R L≤x≤R 中有多少个数 x x x 满足存在整数 y , z y,z y,z 使得 x y 2 − z 2 xy^2-z^2 xy2−z2。 输入格式 输入一行包含两个整数 L , R L,R L,R&#xff…...

隐私通信新时代:磐石云AXB平台如何重塑企业安全防线?

在数据泄露频发的当下&#xff0c;企业如何守护用户隐私&#xff1f;磐石云AXB隐私号平台以四大技术革新&#xff0c;构建通信安全堡垒。 技术突破&#xff1a; 动态号码隔离&#xff0c;隐私0泄露 AXB模式下&#xff0c;A与B的真实号码全程隐藏&#xff0c;仅通过虚拟号X中转…...

什么是八步工作法?

八步工作法&#xff0c;顾名思义&#xff0c;就是把一项工作拆分成八个步骤来完成。它的核心目的是让工作变得更有条理&#xff0c;更高效&#xff0c;避免忙而无序&#xff0c;做到事事有着落&#xff0c;件件有结果。这个方法在很多企业和单位中都有应用&#xff0c;尤其适合…...

日事清团队协作软件:智能制定计划,实时追踪任务进展,文件共享无缝协作,知识库一键沉淀成果​

我们总是有微细目标&#xff0c;日事清可以帮助团队轻松共同制定计划、同步工作进展、共享工作资料、沉淀工作成果。 日事清具体如何帮助团队&#xff1f;你可以先了解以下这些基本功能模块。 从【计划】开始 在日事清中&#xff0c;【计划】是协同办公的开始&#xff0c;邀请…...

全球变暖(蓝桥杯 2018 年第九届省赛)

题目描述 你有一张某海域 NN 像素的照片&#xff0c;. 表示海洋、 # 表示陆地&#xff0c;如下所示&#xff1a; ....... .##.... .##.... ....##. ..####. ...###. .......其中 "上下左右" 四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。 由…...

国际物流怎么找客户?选择适合自己的企业拓客平台

在国际物流行业&#xff0c;获客一直是企业发展的核心难题。无论是跨境电商、传统外贸&#xff0c;还是国际货代&#xff0c;找到精准的客户资源并高效转化&#xff0c;是决定企业能否抢占市场蓝海的关键。今天&#xff0c;我们就来聊聊如何选择一个真正适合的国际物流拓客平台…...

驱动-内核空间和用户空间数据交换

内核空间与用户控件数据交换 前面了解的字符设备中对 file_operations 结构体的进行了填充&#xff0c; 该 结构体的每一个成员都对应着一个系统调用&#xff0c; 例如 read、 write 等&#xff0c; 在字符设备相关的文章中有实验过对 调用函数进行了标志打印&#xff0c; 并没…...

智膳优选 | AI赋能的智慧食堂管理专家 —— 基于飞书多维表格和扣子(Coze)的智能解决方案

智膳优选 | AI赋能的智慧食堂管理专家 基于飞书多维表格和扣子&#xff08;Coze&#xff09;的智能解决方案 数据驱动餐饮管理&#xff0c;让每一餐都是营养与经济的完美平衡&#xff01; “智膳优选”通过整合飞书与Coze&#xff0c;将数据智能引入校园餐饮管理&#xff0…...

FCOS目标检测

一、模型框架 FCOS采用的网络架构和RetinaNet一样&#xff0c;都是采用FPN架构&#xff0c;如图2所示&#xff0c;每个特征图后是检测器&#xff0c;检测器包含3个分支&#xff1a;classification&#xff0c;regression和center-ness。 对于特征图Fi∈RHWC&#xff0c;其相对…...

Linux中动态加载两个同名so(dlopen动态链接库)

// 当前路径下 ./test1.c int Func1(int a, int b) { return ab; } //编译生成so gcc -fPIC -shared -o libTest.so test1.c // 当前路径的test2文件夹中 ./test2/test2.c int Func1(int a, int b) { return a-b; } //编译生成同名so gcc -fPIC -shared -o …...

直播电商革命:东南亚市场的“人货场”重构方程式

一、人设经济3.0&#xff1a;从流量收割到情感基建 东南亚直播战场正经历从"叫卖式促销"到"沉浸式信任"的质变&#xff0c;新加坡市场成为最佳观察样本&#xff1a; 数据印证趋势&#xff1a;Shopee直播用户日均停留28分钟&#xff0c;超短视频平台&#…...

【CF】Day30——Codeforces Round 824 (Div. 2) C + Codeforces Round 825 (Div. 2) BC1

C. Phase Shift 题目&#xff1a; 思路&#xff1a; 好题&#xff0c;值得多看 这题我们看题目就能想到一个很显然的做法&#xff0c;那就是贪心地把每一个字母换成最前面的没使用过的字母 但是这样直接写是有问题的&#xff0c;因为题目说了最后要让所有的字母成一个换&…...

STM32 模块化开发指南 · 第 2 篇 如何编写高复用的外设驱动模块(以 UART 为例)

本文是《STM32 模块化开发实战指南》的第 2 篇,聚焦于“串口驱动模块的设计与封装”。我们将从一个最基础的裸机 UART 初始化开始,逐步实现:中断支持、环形缓冲收发、模块接口抽象与测试策略,构建一个可移植、可扩展、可复用的 UART 驱动模块。 一、模块化 UART 的设计目标…...

SSRF打靶总结

文章目录 一. PortSwigger1、本地服务器的基本SSRF2、基本的目标不是漏洞机3、Referer标头的外带SSRF4、简单黑名单的SSRF黑名单绕过思路&#xff1a; 5、重定向的SSRF6. 简单的白名单SSRF白名单绕过思路&#xff1a; 二、BWAPP1. SSRF 文件包含漏洞 | 内网探测2. XXE -> S…...

第五章:5.1 ESP32物联网应用 - MQTT协议深度教程

一、MQTT协议简介 1.1 发布/订阅模式 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级物联网通信协议&#xff0c;采用发布/订阅模式&#xff1a; 发布者&#xff08;Publisher&#xff09;&#xff1a;发送消息到指定主题&#xff08;如&…...

c++知识点

高级模板技术45&#xff1a; 模板元编程&#xff1a;这是一种在编译期进行计算和代码生成的技术。通过模板的递归展开、特化等操作&#xff0c;可以实现一些复杂的功能&#xff0c;例如编译期的计算、类型安全的容器等。例如&#xff0c;使用模板元编程可以实现一个编译期计算斐…...

【ChCore Lab 01】Bomb Lab 拆炸弹实验(ARM汇编逆向工程)

文章目录 1. 前言2. 实验代码版本问题3. 关于使用问题4. 宏观分析5. read_line 函数介绍6. phase_0 函数6.1. read_int 函数6.2. 回到 phase_0 函数继续分析6.3. 验证结果 7. phase_1 函数7.2. 验证结果 8. phase_2 函数8.1. read_8_numbers 函数8.2. 回到 phase_2 函数继续分析…...

QStackedWidget讲解

简介 QStackedWidget 类在一次仅显示1个窗口的地方提供一个窗口栈。 头文件:#include qmake:QT widgets 基类:QFrame 属性 count : const int currentIndex : int 公有槽函数 void setCurrentIndex(int index) void setCurrentWidget(QWidget *widget)信号 void current…...

宝马集团加速 ERP 转型和上云之旅

宝马集团&#xff08;BMW Group&#xff09;作为全球领先的豪华汽车和摩托车制造商&#xff0c;致力于构建更加智能、绿色、人性化的出行体验。为了支持其全球化、数字化业务战略&#xff0c;宝马集团正在进行大规模的 IT 体系升级和 ERP 云转型。该项目以“RISE with SAP S/4H…...

AutoEval:现实世界中通才机器人操作策略的自主评估

25年3月来自 UC Berkeley 和 Nvidia 的论文“AutoEval: Autonomous Evaluation of Generalist Robot Manipulation Policies in the Real World”。 可规模化且可复现的策略评估一直是机器人学习领域长期存在的挑战。评估对于评估进展和构建更优策略至关重要&#xff0c;但在现…...

ARM Cortex M内存屏障指令__dsb( )和__isb( )

ARM Cortex-M 系列处理器中的 __dsb() 和 __isb() 是内存屏障指令&#xff0c;用于确保内存操作的顺序性和可见性&#xff0c;尤其在涉及外设、多核/多线程、自修改代码或关键系统配置时至关重要。 一&#xff0c;详细说明和典型应用场景 1. __dsb()&#xff08;Data Synchron…...

deepseek热度已过?

DeepSeek的热度并没有消退&#xff0c;以下是具体表现&#xff1a; 用户使用量和下载量方面 • 日活跃用户量增长&#xff1a;DeepSeek已经成为目前最快突破3000万日活跃用户量的应用程序。 • 应用商店下载量&#xff1a;1月26日&#xff0c;DeepSeek最新推出的AI聊天机器人…...

使用 Datadog 和 Slack Alerts 监控 minikube

为什么要监控 minikube 集群&#xff1f;这是一个不错的练习&#xff0c;可以让你了解 DataDog 的设置过程并探索 K8s 指标产品。 本文将分享我的以下经验&#xff1a; 设置最新的 minikube部署示例应用程序创建 DataDog&#xff08;试用&#xff09;帐户使用 Helm 安装 Data…...