【图论】最短路径问题总结

一图胜千言

在这里插入图片描述

单源最短路径

正权值 朴素Dijkstra

dijkstra算法思想是维护一个永久集合U,全部点集合V

循环n -1

从源点开始,在未被访问的节点中,选择距离源点最近的节点 t

以节点 t 为中间节点,更新从起点到其他节点的最短距离。对于每个节点 j,比较当前的 distance[j]distance[t] + graph[t][j],取较小值作为新的 distance[j]

将节点 t 标记为已访问。

在这里插入图片描述

【例题】

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。

请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。

输入格式

第一行包含整数 n 和 m。

接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

输出格式

输出一个整数,表示 1 号点到 n 号点的最短距离。

如果路径不存在,则输出 −1。

数据范围

1≤n≤500,
1≤m≤ 1 0 5 10^5 105,
图中涉及边长均不超过10000。

输入样例:

3 3
1 2 2
2 3 1
1 3 4

输出样例:

3
import java.io.*;
import java.util.*;
public class Main {static final int MAX_NUM = 2147483647 / 2;static final int N = 510;static final int M = 100010;static int[][] graph = new int[N][N];static int[] used = new int[N];static int[] distance = new int[N];static int n, m;public static void main(String[] args) throws Exception {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String row1 = br.readLine();String[] items = row1.split(" ");n = Integer.parseInt(items[0]);m = Integer.parseInt(items[1]);//初始化将graph全初始化为无穷大for(int i = 0; i <= n; i++) {for(int j = 0; j <= n; j++) {graph[i][j] = MAX_NUM;}}//存储邻接矩阵while(m-- > 0) {String row = br.readLine();String[] data = row.split(" ");int x = Integer.parseInt(data[0]);int y = Integer.parseInt(data[1]);int z = Integer.parseInt(data[2]);//因为可能会有重边,只保存最小的graph[x][y] = Math.min(graph[x][y], z);}System.out.print(dijkstra());br.close();}public static int dijkstra() {//将距离初始化为最大值for(int i = 0; i <= n; i++) {distance[i] = MAX_NUM;}distance[1] = 0;for(int i = 0; i < n - 1; i++) {int t = -1;//寻找与永久集合中权值最小的结点for(int j = 1; j <= n; j++) {if(used[j] == 0 && (t == -1 || distance[t] > distance[j])) {t = j;}}//根据t计算从初结点到后序结点和从t结点到后序结点那个值更小for(int j = 1; j <= n; j++) {distance[j] = Math.min(distance[j], distance[t] + graph[t][j]);}//标记t为用过结点used[t] = 1;}if(distance[n] == MAX_NUM) {return -1;} else {return distance[n];}}
}

正权值 堆优化Dijkstra

堆优化版通过优先队列(堆)来快速找到距离源点最近的节点,每次从堆中取出最小元素的时间复杂度为 (O(\log n)),而遍历所有边的时间复杂度为 (O(m))。

朴素版 Dijkstra:适用于稠密图,即边的数量接近节点数量的平方的情况。因为在稠密图中,邻接矩阵可以更方便地存储和访问图的信息。

堆优化版 Dijkstra:适用于稀疏图,即边的数量远小于节点数量的平方的情况。在稀疏图中,邻接表可以节省存储空间,而优先队列可以提高寻找最小距离节点的效率。

核心步骤

当堆不为空时,从堆中取出距离源点最近的节点 no 及其距离 d

如果节点 no 已经确定最短路径,则跳过该节点。

标记节点 no 已经确定最短路径。

遍历节点 no 的所有邻接节点 j,如果通过节点 no 到达节点 j 的距离比当前记录的距离更短,则更新 distance[j] 的值,并将节点 j 及其新的距离加入堆中。

【例题】

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为非负值。

请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出−1。

输入格式

第一行包含整数 n 和 m。

接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

输出格式

输出一个整数,表示 1 号点到 n 号点的最短距离。

如果路径不存在,则输出 −1。

数据范围

1≤n,m≤1.5× 1 0 5 10^5 105,
图中涉及边长均不小于 0,且不超过 10000。
数据保证:如果最短路存在,则最短路的长度不超过 1 0 9 10^9 109

输入样例:

3 3
1 2 2
2 3 1
1 3 4

输出样例:

3
import java.io.*;
import java.util.*;
public class Main {static final int N = 100010;static final int MAX_NUM = 2147483647 / 2;static int[] head = new int[N];static int[] value = new int[N];static int[] weight = new int[N];static int[] ne = new int[N];static int[] used = new int[N];static int[] distance = new int[N];static int n, m, idx;public static void main(String[] args) throws Exception{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] items = br.readLine().split(" ");n = Integer.parseInt(items[0]);m = Integer.parseInt(items[1]);//初始化head数组Arrays.fill(head, -1);//读取m次数据while(m-- > 0) {String[] data = br.readLine().split(" ");int x = Integer.parseInt(data[0]);int y = Integer.parseInt(data[1]);int z = Integer.parseInt(data[2]);add(x, y, z);}System.out.print(dijkstra());}static void add(int from, int to, int w) {value[idx] = to;weight[idx] = w;ne[idx] = head[from];head[from] = idx++;}static int dijkstra() {//初始化距离Arrays.fill(distance, MAX_NUM);distance[1] = 0;PriorityQueue<int[]> heap = new PriorityQueue<>((a, b) -> a[0] - b[0]);heap.offer(new int[]{0, 1});while(!heap.isEmpty()) {//从堆中取出离源点距离最小的元素int[] item = heap.poll();int d = item[0];int no = item[1];//判断该点是否已经在永久集合中if(used[no] == 1) {continue;}used[no] = 1;//根据这一点去计算其他通过该点达到的结点的距离是否更新for(int i = head[no]; i != -1; i = ne[i]) {//结点编号int j = value[i];if(distance[j] > distance[no] + weight[i]) {distance[j] = distance[no] + weight[i];heap.offer(new int[]{distance[j], j});}}}return distance[n] == MAX_NUM ? -1 : distance[n];}
}

负权值 bellman-ford

核心逻辑

初始化

  • distance 数组的所有元素初始化为无穷大 MAX_NUM,表示初始时所有节点到源点的距离都是未知的。
  • 将源点(节点 1)的距离 distance[1] 初始化为 0,因为源点到自身的距离为 0。

迭代更新距离

  • 进行 k 次迭代,每次迭代的目的是保证找到的最短路径最多经过 k 条边。
  • 在每次迭代之前,先将 distance 数组复制到 temp 数组中。这一步是为了避免在更新距离时出现数据串联的问题,确保每次更新都是基于上一次迭代的结果。
  • 遍历 edges 列表中的每一条边 e,对于每条边,尝试通过这条边来更新终点 e.to 的最短距离。具体来说,比较当前 distance[e.to]temp[e.from] + e.weight 的大小,取较小值作为新的 distance[e.to]。(对每一条边进行松弛操作)

如果经历至多n - 1次迭代,能够收敛于稳定,否则一定会有负环

在这里插入图片描述

负环每走一次都会使得距离变短,导致无穷循环

对于由n个结点构成的链路,最多有n-1跳,所以超过n - 1跳就一定会有负环存在,且不可能是最短路径

在这里插入图片描述

【例题】

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数

请你求出从 1 号点到 n 号点的最多经过 k 条边的最短距离,如果无法从 1 号点走到 n 号点,输出 impossible

注意:图中可能 存在负权回路

输入格式

第一行包含三个整数 n,m,k。

接下来 mm 行,每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

点的编号为 1∼n。

输出格式

输出一个整数,表示从 1 号点到 n 号点的最多经过 k 条边的最短距离。

如果不存在满足条件的路径,则输出 impossible

数据范围

1≤n,k≤500,
1≤m≤10000,
1≤x,y≤n,
任意边长的绝对值不超过 10000。

输入样例:

3 3 1
1 2 1
2 3 1
1 3 3

输出样例:

3
import java.io.*;
import java.util.*;
public class Main {static class edge {public int from;public int to;public int weight;public edge(int from, int to, int weight) {this.from = from;this.to = to;this.weight = weight;}}static final int N = 510;static final int MAX_NUM = 2147483647 / 2;static int n, m, k;static List<edge> edges = new ArrayList<>();static int[] distance = new int[N];public static void main(String[] args) throws Exception{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] items = br.readLine().split(" ");n = Integer.parseInt(items[0]);m = Integer.parseInt(items[1]);k = Integer.parseInt(items[2]);while (m-- > 0) {String[] data = br.readLine().split(" ");int from = Integer.parseInt(data[0]);int to = Integer.parseInt(data[1]);int weight = Integer.parseInt(data[2]);edges.add(new edge(from, to, weight));}//调用bellman ford算法bellmanFord();}public static void bellmanFord() {//初始化distanceArrays.fill(distance, MAX_NUM);distance[1] = 0;//k次循环保证最多经过k条边的距离for (int i = 0; i < k; i++) {//拷贝distance数组,避免数据串联int[] temp = Arrays.copyOf(distance, distance.length);for (edge e : edges) {distance[e.to] = Math.min(distance[e.to], temp[e.from] + e.weight );}}//判断distance[n]的大小, MAX_NUM / 2 是终点前的负值边对对distance[n]产生影响,会使最大值减少 k * weight if (distance[n] > MAX_NUM / 2) {System.out.println("impossible");} else {System.out.println(distance[n]);}}
}

负权值 SPFA

Bellman - Ford 算法的时间复杂度是 (O(k m)),其中 k 通常是节点数 n,也就是在一般情况下时间复杂度为 (O(n m))。这是因为在每一轮迭代中,它都会对图中的每一条边进行松弛操作,不管这条边是否能真正更新节点的最短距离。在很多情况下,大量的松弛操作是不必要的,导致算法效率较低。

当图的规模较大时,Bellman - Ford 算法的性能会变得很差。而 SPFA(Shortest Path Faster Algorithm)算法就是为了优化 Bellman - Ford 算法的效率而提出的,它通过队列来减少不必要的松弛操作,从而在很多情况下能显著提高算法的执行效率。

SPFA 算法的核心思想是利用队列来维护待处理的节点。只有当一个节点的最短距离被更新时,才将其加入队列,等待后续对其出边进行松弛操作。这样就避免了 Bellman - Ford 算法中对所有边进行无意义的松弛操作,从而减少了不必要的计算。

初始化

  • 定义常量 N 表示节点的最大数量,MAX_NUM 表示无穷大。
  • 初始化邻接表相关数组 headvalueweightne 用于存储图的信息。
  • 初始化队列 queue,队头指针 hh 和队尾指针 tt
  • 初始化 distance 数组,将所有节点的距离初始化为无穷大,源点(节点 1)的距离初始化为 0。
  • 初始化 inQueue 数组,用于标记节点是否在队列中,初始时所有节点都不在队列中。

入队操作

将源点(节点 1)加入队列,并标记其在队列中。

队列处理

  • 当队列不为空时,从队头取出一个节点 t,并标记该节点不在队列中。

  • 遍历节点t的所有出边:

    • 对于每一条出边 (t, j),如果通过节点 t 到达节点 j 的距离比当前记录的 distance[j] 更短,则更新 distance[j] 的值。
    • 如果节点 j 不在队列中,则将其加入队列,并标记其在队列中。

【例题】

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数

请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 impossible

数据保证不存在负权回路。

输入格式

第一行包含整数 n 和 m。

接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

输出格式

输出一个整数,表示 1 号点到 n 号点的最短距离。

如果路径不存在,则输出 impossible

数据范围

1≤n,m≤ 1 0 5 10^5 105,
图中涉及边长绝对值均不超过 10000。

输入样例:

3 3
1 2 5
2 3 -3
1 3 4

输出样例:

2
import java.io.*;
import java.util.*;
public class Main {static final int N = 100010;static final int MAX_NUM = 2147483647 / 2;static int[] head = new int[N];static int[] value = new int[N];static int[] weight = new int[N];static int[] ne = new int[N];static int hh = 0, tt = -1, idx = 0, n, m;static int[] queue = new int[N];static int[] distance = new int[N];static boolean[] inQueue = new boolean[N];public static void main(String[] args) throws Exception{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] row1 = br.readLine().split(" ");n = Integer.parseInt(row1[0]);m = Integer.parseInt(row1[1]);//初始化head数组Arrays.fill(head, -1);//m次读入while(m-- > 0) {String[] data = br.readLine().split(" ");int x = Integer.parseInt(data[0]);int y = Integer.parseInt(data[1]);int z = Integer.parseInt(data[2]);add(x, y, z);}spfa();br.close();}static void add(int from, int to, int w) {value[idx] = to;weight[idx] = w;ne[idx] = head[from];head[from] = idx++;}static void spfa() {//初始化distance数组Arrays.fill(distance, MAX_NUM);distance[1] = 0;//将第一个数加入队列queue[++tt] = 1;//更新1的状态inQueue[1] = true;while(hh <= tt) {//从队头取出一个数int t = queue[hh++];//更新队头元素的状态inQueue[t] = false;//遍历该结点的所有出边for(int i = head[t]; i != -1; i = ne[i]) {int j = value[i];if(distance[j] > distance[t] + weight[i]) {distance[j] = distance[t] + weight[i];if(inQueue[j] == false) {queue[++tt] = j;inQueue[j] = true;}}}}if(distance[n] == MAX_NUM) {System.out.print("impossible");} else {System.out.print(distance[n]);}}
}

多源最短路径

Floyd

算法原理

Floyd 算法通过一个三层循环来逐步更新图中各顶点对之间的最短路径。设图中有 n 个顶点,用邻接矩阵 (graph[i][j]) 表示顶点 i 到顶点 j 的边权(若 i 和 j 之间没有边,则权值为无穷大)。

定义一个三维数组 (dist[k][i][j]) 表示从顶点 i 到顶点 j 经过编号不超过 k 的顶点的最短路径长度(也可简化为二维数组 (dist[i][j]) ,在每次迭代中直接更新)。

迭代过程分析

  • 初始状态:在算法开始时,(dist[0][i][j]=graph[i][j]) ,即不经过任何中间顶点时,顶点 i 到顶点 j 的距离就是它们之间的边权。这是符合实际情况的,因为没有中间节点参与时,两点间距离就是直接相连的边权(若不相连则为无穷大)。
  • 第 k 次迭代:在第 k 次迭代中,对于每一对顶点 ((i, j)) ,考虑是否经过顶点 k 会使 i 到 j 的路径更短。即比较 (dist[k - 1][i][j]) (不经过顶点 k 时 i 到 j 的最短路径)和 (dist[k - 1][i][k]+dist[k - 1][k][j]) (经过顶点 k ,从 i 到 k 再从 k 到 j 的路径长度 )的大小。取较小值作为 (dist[k][i][j]) 。

这种比较是合理的,因为如果存在一条从 i 到 j 经过顶点 k 的更短路径,那么必然是由从 i 到 k 的最短路径和从 k 到 j 的最短路径组成。而在第 k 次迭代时,我们已经知道了不经过顶点 k (即经过编号小于 k 的顶点子集 )时从 i 到 k 和从 k 到 j 的最短路径(分别为 (dist[k - 1][i][k]) 和 (dist[k - 1][k][j]) ) 。通过这种比较和更新,我们能得到经过编号不超过 k 的顶点时 i 到 j 的最短路径。

【例题】

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,边权可能为负数。

再给定 k 个询问,每个询问包含两个整数 x 和 y,表示查询从点 x 到点 y 的最短距离,如果路径不存在,则输出 impossible

数据保证图中不存在负权回路。

输入格式

第一行包含三个整数 n,m,k。

接下来 m 行,每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

接下来 k 行,每行包含两个整数 x,y,表示询问点 xx 到点 y 的最短距离。

输出格式

共kk 行,每行输出一个整数,表示询问的结果,若询问两点间不存在路径,则输出 impossible

数据范围

1≤n≤200,
1≤k≤n2
1≤m≤20000,
图中涉及边长绝对值均不超过 10000。

输入样例:

3 3 2
1 2 1
2 3 2
1 3 1
2 1
1 3

输出样例:

impossible
1
import java.io.*;
import java.util.*;
public class Main {static final int MAX_NUM = 2147483647 / 2;static final int N = 210;static int n, m;static int[][] graph = new int[N][N];public static void main(String[] args) throws Exception {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] row1 = br.readLine().split(" ");n = Integer.parseInt(row1[0]);m = Integer.parseInt(row1[1]);int q = Integer.parseInt(row1[2]);//对邻接矩阵进行初始化for(int i = 1; i <= n; i++) {for(int j = 1; j <= n; j++) {if(i == j) {graph[i][j] = 0;} else {graph[i][j] = MAX_NUM;}}}for(int i = 1; i <= m; i++) {String[] data = br.readLine().split(" ");int a = Integer.parseInt(data[0]);int b = Integer.parseInt(data[1]);int c = Integer.parseInt(data[2]);graph[a][b] = Math.min(graph[a][b], c);}floyd();//q次询问while(q-- > 0) {String[] fromTo = br.readLine().split(" ");int from = Integer.parseInt(fromTo[0]);int to = Integer.parseInt(fromTo[1]);if(graph[from][to] > MAX_NUM / 2) {System.out.println("impossible");} else {System.out.println(graph[from][to]);}}}static void floyd() {for(int k = 1; k <= n; k++) {for(int i = 1; i <= n; i++) {for(int j = 1; j <= n; j++) {graph[i][j] = Math.min(graph[i][j], graph[i][k] + graph[k][j]);}}}}
}

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

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

相关文章

【最佳实践】win11使用hyper-v安装ubuntu 22/centos,并配置固定ip,扫坑记录

文章目录 场景查看本机的win11版本启用hyper-vhyper-v安装ubuntu22虚拟机1.准备好个人的 iso文件。2. hyper-v 快速创建3.编辑设置分配内存自定义磁盘位置设置磁盘大小连接网络修改虚拟机名称自定义检查点位置 和智能分页件位置虚拟机第一次连接给ubuntu22配置固定ip遇到过的坑…

自然语言处理(25:(终章Attention 1.)Attention的结构​)

系列文章目录 终章 1&#xff1a;Attention的结构 终章 2&#xff1a;带Attention的seq2seq的实现 终章 3&#xff1a;Attention的评价 终章 4&#xff1a;关于Attention的其他话题 终章 5&#xff1a;Attention的应用 目录 系列文章目录 前言 Attention的结构 一.seq…

Git 命令大全:通俗易懂的指南

Git 命令大全&#xff1a;通俗易懂的指南 Git 是一个功能强大且广泛使用的版本控制系统。对于初学者来说&#xff0c;它可能看起来有些复杂&#xff0c;但了解一些常用的 Git 命令可以帮助你更好地管理代码和协作开发。本文将介绍一些常用的 Git 命令&#xff0c;并解释它们的…

基于yolov11的棉花品种分类检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv11的棉花品种分类检测系统是一种高效、准确的农作物品种识别工具。该系统利用YOLOv11深度学习模型&#xff0c;能够实现对棉花主要品种&#xff0c;包括树棉&#xff08;G. arboreum&#xff09;、海岛棉&#xff08;G. barbadense&#xff09;、草棉&a…

论文:Generalized Category Discovery with Clustering Assignment Consistency

论文下载&#xff1a; https://arxiv.org/pdf/2310.19210 一、基本原理 该方法包括两个阶段:半监督表示学习和社区检测。在半监督表示学习中&#xff0c;使用了监督对比损失来充分地推导标记信息。此外&#xff0c;由于对比学习方法与协同训练假设一致&#xff0c;研究引入了…

Java高级JVM知识点记录,内存结构,垃圾回收,类文件结构,类加载器

JVM是Java高级部分&#xff0c;深入理解程序的运行及原理&#xff0c;面试中也问的比较多。 JVM是Java程序运行的虚拟机环境&#xff0c;实现了“一次编写&#xff0c;到处运行”。它负责将字节码解释或编译为机器码&#xff0c;管理内存和资源&#xff0c;并提供运行时环境&a…

MySQL 5.7 Online DDL 技术深度解析

14.13.1 在线DDL操作 索引操作主键操作列操作生成列操作外键操作表操作表空间操作分区操作 索引操作 下表概述了对索引操作的在线DDL支持情况。星号表示有附加信息、例外情况或依赖条件。有关详细信息&#xff0c;请参阅语法和使用说明。 操作原地执行重建表允许并发DML仅修…

kafka 报错消息太大解决方案 Broker: Message size too large

kafka-configs.sh --bootstrap-server localhost:9092 \ --alter --entity-type topics \ --entity-name sim_result_zy \ --add-config max.message.bytes10485880 学习营课程

HarmonyOS:ComposeTitleBar 组件自学指南

在日常的鸿蒙应用开发工作中&#xff0c;我们常常会面临构建美观且功能实用的用户界面的挑战。而标题栏作为应用界面的重要组成部分&#xff0c;它不仅承载着展示页面关键信息的重任&#xff0c;还能为用户提供便捷的操作入口。最近在参与的一个项目里&#xff0c;我就深深体会…

前端面试题之CSS中的box属性

前几天在面试中遇到面试官问了一个关于box的属性面试题&#xff0c;平时都是直接AI没有仔细去看过。来说说CSS中的常用box属性&#xff1a; 1. box-sizing box-sizing 属性定义了元素的宽度和高度是否包括内边距&#xff08;padding&#xff09;和边框&#xff08;border&…

前端开发时的内存泄漏问题

目录 &#x1f50d; 什么是内存泄漏&#xff08;Memory Leak&#xff09;&#xff1f;&#x1f6a8; 常见的内存泄漏场景1️⃣ 未清除的定时器&#xff08;setInterval / setTimeout&#xff09;2️⃣ 全局变量&#xff08;变量未正确释放&#xff09;3️⃣ 事件监听未清除4️⃣…

Java 基础-30-单例设计模式:懒汉式与饿汉式

在软件开发中&#xff0c;单例设计模式&#xff08;Singleton Design Pattern&#xff09;是一种常用的设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点。这种模式通常用于管理共享资源&#xff08;如数据库连接池、线程池等&#xff09;或需要…

为 MinIO AIStor 引入模型上下文协议(MCP)服务器

Anthropic 最近宣布的模型上下文协议 &#xff08;MCP&#xff09; 将改变我们与技术交互的方式。它允许自然语言通信替换许多任务的复杂命令行语法。不仅如此&#xff0c;语言模型还可以总结传统工具的丰富输出&#xff0c;并以人类可读的形式呈现关键信息。MinIO 是世界领先的…

2023年12月电子学会青少年软件编程四级考级真题—新“跳7”游戏

此题可点下方去处查看&#xff0c;支持在线编程&#xff0c;获取源码&#xff1a; 新“跳7”游戏_scratch_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/scratch/show-5109.html?_shareid3 程序演示可点击下方查看&#xff0c;支持源码查看&#xff1a;新“跳7…

3D 地图渲染-区域纹理图添加

引入-初始化地图&#xff08;关键代码&#xff09; // 初始化页面引入高德 webapi -- index.html 文件 <script src https://webapi.amap.com/maps?v2.0&key您申请的key值></script>// 添加地图容器 <div idcontainer ></div>// 地图初始化应该…

如何避免内存泄漏,尤其是在React中

在React中避免内存泄漏主要涉及到两个方面&#xff1a;组件的卸载清理和异步操作的正确管理。以下是几个关键的策略和最佳实践&#xff1a; 1. 清理组件中的事件监听器和定时器 当组件卸载时&#xff0c;确保清除所有绑定的事件监听器和定时器&#xff0c;否则它们会持续占用内…

如何学习C++以及C++的宏观认知

学习方法 首先可以给出一个论断&#xff1a;C的语法和各种组件的原理及使用可以说是所有编程语言里面比较难的 那么如何掌握所有东西&#xff0c;比如网络编程&#xff0c;文件读写&#xff0c;STL。 不要对语法记各种笔记&#xff0c;比如vector容器有什么什么方法什么什么…

Minimind 训练一个自己专属语言模型

发现了一个宝藏项目&#xff0c; 宣传是完全从0开始&#xff0c;仅用3块钱成本 2小时&#xff01;即可训练出仅为25.8M的超小语言模型MiniMind&#xff0c;最小版本体积是 GPT-3 的 17000&#xff0c;做到最普通的个人GPU也可快速训练 https://github.com/jingyaogong/minimi…

Spring Boot 与 Spring Integration 整合教程

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Spring Boot 与 Spring Integration 整合教程 简介 Spring Integration 是 Spring 生态系统中用于实现企业集成模式&#xff08;Enterprise Integration Pa…

Nginx 核心配置详解与性能优化最佳实践

1.什么是 Nginx&#xff1f; Nginx 是一个高性能的 Web 服务器和反向代理服务器。它轻量、高效&#xff0c;被广泛用于现代 Web 开发中。 2.为什么前端需要了解 Nginx&#xff1f; ★ 了解 本地开发&#xff1a;可以模拟生产环境 部署前端项目&#xff1a;作为静态文件服务器…