首页 > 编程语言 >Dijkstra单源最短路朴素算法(空间优化)

Dijkstra单源最短路朴素算法(空间优化)

时间:2024-12-18 11:41:49浏览次数:3  
标签:node 遍历 min int 短路 单源 iter Dijkstra dis

Dijkstra单源最短路朴素算法(空间优化)

基于使用邻接表存储连接边的方法,可以有效的降低空间复杂度

稀疏图(边的数量远小于顶点数量平方的图)中,邻接矩阵会大量占用无用的内存,导致Re,我们采用邻接表的办法,只存储存在的边,减少无关占用。相反,在稠密图(边的数量接近顶点数的平方的图)中,邻接表会遍历一整条链,检索时间会大大增加(不做优化),我们就采取邻接矩阵的方法来存储,每次只需要通过下标快速检索

通过结构体和vector来构造边的链表

struct edge
{
	int v, w;//v表示连接到的节点,w表示边权重
};
vector<edge> e[10010];

插入边操作

void insert(int u, int v, int w) {
	e[u].push_back({ v,w });
}

cin >> u >> v >> w;
insert(u, v, w);

然后是使用朴素的Dijkstra算法实现单源最短路

void dijkstra(int s) {
	memset(dis, 0x3f, sizeof dis);//初始化可以使用memset 0x3f 批量操作
	dis[s] = 0;//起始点被访问
	for (int i = 1; i <= n; i++) {
		int min_node = 0;//初始化

		for (int j = 1; j <= n; j++)//遍历所有点
			min_node = dis[j] < dis[min_node] && !vis[j] ? j : min_node;
//找未被访问过的点中的最近点,判断最小值
		
		if (!min_node) break;//如果没能找到,即min_node未更新,退出循环
		vis[min_node] = 1;//当前点已被访问过

		for (auto it = e[min_node].begin(); it != e[min_node].end(); it++)//迭代器遍历当前点的所有连通边
			dis[it->v] = min(dis[min_node] + it->w, dis[it->v]);//更新最小值
	}
}

使用迭代器遍历时,需要通过箭头运算符 -> 来访问结构体的成员元素

for (auto it = e[min_node].begin(); it != e[min_node].end(); it++)
	dis[it->v] = min(dis[min_node] + it->w, dis[it->v]);

同样也可使用C++11标准内的区间遍历

for (auto iter : e[min_node])
	dis[iter.v] = min(dis[min_node] + iter.w, dis[iter.v]);

区间遍历的一般格式

for (dataType rangeVariable : array) 

dataType为需要遍历的数组的数据类型, rangeVariable为循环内范围变量的名称,该变量用来接收遍历元素的值array为需要遍历的数组名,区间遍历的范围变量只需要通过 . 就能访问结构的成员元素

标签:node,遍历,min,int,短路,单源,iter,Dijkstra,dis
From: https://www.cnblogs.com/dianman/p/18614485

相关文章

  • 【MATLAB源码-第247期】基于matlab的秃鹰搜索优化算法(BES)无人机三维路径规划,输出做
    操作环境:MATLAB2022a1、算法描述秃鹰搜索优化算法(BaldEagleSearch,BES)是一种新颖的群体智能优化算法,受自然界中秃鹰猎食行为的启发而设计。与其他群体智能算法类似,BES试图通过模拟自然界的某些行为来解决复杂的优化问题。该算法的核心思想是通过模拟秃鹰在猎食过程中的......
  • 多源最短路Floyd算法
    多源最短路算法-Floyd使用Floyd(弗洛伊德)算法,可以以\(O(n^3)\)的时间复杂度求出一张多源图的任意两点间的最短路径一般采用邻接矩阵的方法来存储图:intg[N][N];g[i][j]其中,g[i][j]的意义为第i个节点到第j个节点的权重我们需要对邻接矩阵进行路径初始化,将自身到自身的权重......
  • PbootCMS如何启用文章短路径模式?
    PbootCMS支持文章短路径模式,这种模式允许文章访问地址不再携带栏目地址,而是直接挂在根路径。启用文章短路径模式可以使文章URL更加简洁,提升用户体验。以下是详细的启用步骤和注意事项:启用文章短路径模式进入PbootCMS后台管理系统。导航到“全局配置”模块。选择“URL规则”......
  • 最短路----Dijkstra算法详解
    简介迪杰斯特拉(Dijkstra)算法是一种用于在加权图中找到单个源点到所有其他顶点的最短路径的算法。它是由荷兰计算机科学家艾兹格·迪科斯彻(EdsgerDijkstra)在1956年提出的。Dijkstra算法适用于处理带有非负权重的图。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法,每次遍历......
  • 同余最短路
    同余最短路同余最短路可以用于解决形如"给定\(n\)个整数,求这\(n\)个整数能拼凑出多少的其他的整数(\(n\)个整数可以重复选取)"以及"给定\(n\)个整数,求这\(n\)个整数不能拼凑出的最小(最大)的整数",或者"至少要拼几次才能拼出模\(k\)余\(p\)的数的问题......
  • Dijkstra 最短路径算法
    此篇文章在2023年9月28日被记录Dijkstra算法的核心点是贪心算法:不断寻找最短的点,在最短的点上更新最短路径1.前言想要了解学习Dijkstra算法,需要先了解无向图与权重图,无向图顾名思义就是没有方向的图,下面表示了有向图和无向图以及权重图2.什么是Dijkstra算法Dijkstra算法......
  • 课程设计/单源最短路径问题的求解
    一、问题分析    问题描述:给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和,这个问题通常称为单源最短路径问题。该问题的经典求解方法为迪克斯特......
  • [模板] 单源最短路 Dijksra
    单源最短路:Dijksra单源最短路,时间复杂度\(O(nlog(n+m))\)不适用于有负权边的图#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;structedge{intto,w;};vector<vector<edge>>adj;vector<int>dis;vector<bool>vis;intn,m,......
  • 图常见算法大全( 三种遍历算法 + 三种最短路径算法 + 两种最小生成树)
    图的经典算法完整版万字原文见史上最全详解图数据结构一、图的遍历算法1.voidDFS(intstartVertex);2.voidBFS(intstartVertex);3.voidTopologicalSort();(两种实现方式)1.DFS(深度优先搜索)算法原理是一种用于遍历或搜索图(包括树)中节点的算法。其基本思想......
  • 迪克斯特拉算法:单源最短路径问题
    一、迪杰斯特拉算法的介绍迪杰斯特拉(Dijkstra)算法是一种用于计算加权图中单源最短路径的经典算法,由荷兰计算机科学家艾兹赫·迪杰斯特拉(EdsgerDijkstra)于1956年提出。迪杰斯特拉算法的核心思想是通过贪心策略,不断选择当前路径代价最小的节点,并逐步扩展搜索范围,直到找到从源节......