【图】单源最短路径

最短路径

  • 图上的最短路径:两顶点之间经过的边数最少的路径;

  • 网上的最短路径:两顶点之间经过的边上权值之和最少的路径(源点->终点)。

a星算法、迪杰斯特拉算法、佛洛依德算法。

迪杰斯特拉算法

单源最短路径按路径长度递增的次序产生最短路径的算法。过程如下:

  1. 找到直接能到达的最短路径

  2. 以最短到达的终点为源点继续找能直接到达的

  3. 更新最短路径

需要记住路径和最短路径

  • 最短路径的值:shortpath[9]

  • 最短路径当前顶点的前一个顶点:path[9]

  • 记录顶点是否被选过:visited[9] = {0};

  • 用邻接矩阵Edge存边权

  • 记录当前最小值:min

  • min_index = 记录到达最短路径的下标

 

创建一个图:

主函数: 

void main()
    {
	Graph g;
	g.InsertVertex('a');
	g.InsertVertex('b');
	g.InsertVertex('c');
	g.InsertVertex('d');
	g.InsertVertex('e');
	g.InsertVertex('f');
	g.InsertVertex('g');
	g.InsertVertex('h');
	g.InsertVertex('i');
	g.InsertEdge('a', 'b', 1);
	g.InsertEdge('a', 'c', 5);
	g.InsertEdge('b', 'c', 3);
	g.InsertEdge('b', 'd', 7);
	g.InsertEdge('b', 'e', 5);
	g.InsertEdge('c', 'e', 1);
	g.InsertEdge('c', 'f', 7);
	g.InsertEdge('d', 'g', 3);
	g.InsertEdge('d', 'e', 2);
	g.InsertEdge('e', 'g', 6);
	g.InsertEdge('e', 'h', 9);
	g.InsertEdge('e', 'f', 3);
	g.InsertEdge('f', 'h', 5);
	g.InsertEdge('g', 'h', 2);
	g.InsertEdge('g', 'i', 7);
	g.InsertEdge('h', 'i', 4);

	g.PrintGraph();
	g.ShortPath('a');
}

单元最短路径ShortPath:

ShortPath(char vertex);

输入点,从该点开始找它为起点的单元最短路径。

得到下标:

	int v = GetVertexIndex(vertex);
	if (v == -1) return;

shortpath:最短路径的值

path:最短路径-当前顶点的前一个顶点

visited:记录顶点是否被选过

int* shortpath = new int[m_NumVertex];
int* path = new int[m_NumVertex];
int* visited = new int[m_NumVertex];

初始化数组:

	int i, j;
	for (i = 0; i < m_NumVertex; i++)
	{
		shortpath[i] = m_Edge[v][i];//把权值存到shortpath中
		visited[i] = 0;//没有被访问-0
		if (i != v&&shortpath[i]<MAX_WEIGHT)//不是自己到自己 且 可以到达
		{
			path[i] = v;//可以到达,v作为其前一个顶点
		}
		else
			path[i] = -1;//不能到达-1
	}
	visited[v] = 1;访问完置为1

循环计算从当前顶点到其余各顶点的最短路径

min:最小权值

min_index:目的下标

    int min;//min是最小权值
	int min_index;//min_index是目的下标
	for (i = 0; i < m_NumVertex - 1; i++)
	{
		min = MAX_WEIGHT;
		min_index = -1;
		for (j = 0; j < m_NumVertex; ++j)
		{
            //顶点没有被访问过 且 权值<最短路径
			if (!visited[j] && shortpath[j] < min)
			{
            //更新最短路径和其目的下标
				min = shortpath[j];
				min_index = j;
			}
		}
        //当前最短路径目的节点被访问
		visited[min_index] = 1;

	   //更新看从min_index到其余没有找到的路经顶点的权值加上min是否小于原本的权值
//如果小则更新
		for (j = 0; j < m_NumVertex; j++)
		{
			int w = m_Edge[min_index][j];//最短路径目的节点到其他点的权值
			if (!visited[j] && w < MAX_WEIGHT&&shortpath[min_index]+w<shortpath[j])
			{
				shortpath[j] = shortpath[min_index] + w;
				path[j] = min_index;
			}
		}
	}

输出-释放

for (i = 0; i < m_NumVertex; i++)
	{
		cout << vertex << "->" << m_VertexArr[i] << 
":" << shortpath[i] << ":" << path[i];//起点->终点:权值:前一个顶点下标
		cout << endl;
	}
	delete[]shortpath;
	delete[]path;
	delete[]visited;
	shortpath = nullptr;
	path = nullptr;
	visited = nullptr;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java SSM 互助旅游管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM 互助旅游管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采…

【C++ 基础篇:21】:friend 友元四连问:什么是友元?友元类?友元函数?什么时候用友元?

本系列 C 相关文章 仅为笔者学习笔记记录&#xff0c;用自己的理解记录学习&#xff01;C 学习系列将分为三个阶段&#xff1a;基础篇、STL 篇、高阶数据结构与算法篇&#xff0c;相关重点内容如下&#xff1a; 基础篇&#xff1a;类与对象&#xff08;涉及C的三大特性等&#…

运筹说 第25期 | 对偶理论经典例题讲解

对偶理论是研究线性规划中原始问题与对偶问题之间关系的理论&#xff0c;主要研究经济学中的相互确定关系&#xff0c;涉及到经济学的诸多方面。产出与成本的对偶、效用与支出的对偶&#xff0c;是经济学中典型的对偶关系。 对偶理论中最有力的武器是影子价格&#xff0c;影子…

android

1.(单选题4.0分)在使用输入框EditText控件时&#xff0c;当其文本内容为空的时候&#xff0c;做出一些提示&#xff0c;那么使用的属性是 () 。 A. android:background B.android:inputType C. android:hint D.android:text 我的答案:C正确答案:C 4.0分 2.(单选题,4.0分)下列哪…

锐捷AC的部署实例

进行锐捷AC部署时&#xff0c;遇到了一些问题&#xff0c;遂记录下来&#xff0c;如若大家在项目过程中遇到类似问题可以对照解决。 写在前面&#xff08;锐捷AC的基础配置&#xff09; ac-controller //配置AC的capwap源地址信息&#xff0c;国家码等…

基于JavaWeb的保护动物管理系统设计与实现

摘要&#xff1a;随着全球一些稀有物种、野生动物日益稀少&#xff0c;保护动物已经成为全球多个国家开始重视并投入大量物力着手解决的重要课题。动物是大自然的产物&#xff0c;自然界是由许多复杂的生态系统构成的。有一种植物消失了&#xff0c;以这种植物为食的昆虫就会消…

电脑通过VNC连接树莓派

0. 实验准备 VNC软件 VNC Viewer 或者 MobaXterm&#xff08;安装包点击即可下载&#xff09; 可以使用SSH登录进去或者有屏幕的树莓派 一台可以使用的电脑 树莓派和电脑连接在同一个局域网下 0.5 树莓派的公共操作 打开树莓派的 VNC 功能 有屏幕的 打开 VNC 功能&#xff…

《Apollo 智能驾驶进阶课程》四、感知

1. 感知概貌 2. 传感器和标定 激光雷达&#xff1a;主动式&#xff0c;发射功率限制 Camera: 被动式&#xff0c;受到光照影响大 Radar : 多普勒效率 相对速度 超声波: 感知距离有限&#xff0c;倒车时使用。 … 最后设备还在研发过程中。 PnP问题&#xff0c;解决标定。 IC…

BEVFormer组件分析

BEVFormerEncoder中的get_reference_points staticmethoddef get_reference_points(H, W, Z8, num_points_in_pillar4, dim3d, bs1, devicecuda, dtypetorch.float):"""Get the reference points used in SCA and TSA.Args:H, W: spatial shape of bev.Z: hight…

【IMX6ULL驱动开发学习】02.IMX6ULL烧写Linux系统

由于我买的是正点原子的IMX6ULL阿尔法开发板&#xff0c;但是我是看韦东山老师视频学习的驱动 所以这里我烧录的方法是按照韦东山老师的课程来的 这里给出烧写Linux系统用到的工具 链接&#xff1a;https://pan.baidu.com/s/1bD-xxn3K8xQAVkJSaJmTzQ 提取码&#xff1a;af6w …

Keysight是德MSOS604A高清晰度示波器1 GH

Keysight是德MSOS604A S系列示波器配备 6 GHz 存储器、15 英寸 XGA 电容触摸屏和 10 位模数转换器。主要特性与技术指标 1 GHz带宽和平坦的频率响应确保高信号保真度 20 GSa/s 最大采样率 10 位模数转换器&#xff08;ADC&#xff09;保证高垂直分辨率 低噪声前端&#xff…

EDA数字钟(三)

文章目录 前言一、设计内容二、模块结构三、代码编写1、顶层模块Digclk2、状态控制模块Ctrl3、按键消抖模块Filter4、计时模块Time5、闹钟模块Alarm6、显示模块Display7、数码管驱动模块Smg 四、测试文件五、波形仿真总结 前言 再次编写数字钟Verilog程序&#xff0c;使其符合…

Mysql的事务

MySQL中的事务是一组数据库操作&#xff0c;这些操作被视为单个逻辑单元并且被当做原子操作执行&#xff0c;这意味着它们要么全部成功&#xff0c;要么全部失败&#xff0c;没有中间状态。事务通常用于确保数据库中的数据完整性和一致性。 在MySQL中&#xff0c;事务可以使用以…

玩转css逐帧动画,努力成为更优质的Ikun~

&#x1f389; 一、前言 css3的animation想必大家都知道吧&#xff0c;那 steps 逐帧动画你知道吗&#xff1f;对于我来说&#xff0c;实际工作及练习中也很少用到这种跳跃式变化的动画&#xff0c;而它start和end的解释又比较“不说人话”&#xff0c;以前用到steps动画的时候…

Linux - 第23节 - Linux高级IO(一)

目录 1.IO的基本概念 2.钓鱼五人组 3.五种IO模型 3.1.阻塞IO 3.2.非阻塞IO 3.3.信号驱动IO 3.4.IO多路转接 3.5.异步IO 4.高级IO重要概念 4.1.同步通信 VS 异步通信 4.2.阻塞 VS 非阻塞 5.其他高级IO 6.阻塞IO 7.非阻塞IO 7.1.fcntl函数介绍 7.2.fcntl函数的使…

MobPush 推送查询API

IP绑定 工作台可以绑定服务器IP地址&#xff0c;未绑定之前所有IP均可进行REST API的调用&#xff0c;绑定后进仅绑定的IP才有调用权限。 设备信息查询接口 根据RegistrationId查询设备信息 接口地址 http://api.push.mob.com/device-v3/getById/{registrationId} 请求方式…

三种编码方式(费诺曼编码,霍夫曼编码,哈夫曼树编码)的简单解释和介绍

一. 费诺曼(Fano)编码是一种前缀编码&#xff0c;其基本原理是将出现频率较高的符号用短的编码表示&#xff0c;而出现频率较低的符号则用长的编码表示。通过这种方式进行编码&#xff0c;可以达到更好的压缩效果。 费诺曼编码的具体过程如下&#xff1a; 将要编码的符号按照…

一个小时入门 Android Compose 动画

0. 前言 前段时间对于Android中的Compose动画做了系统性的学习&#xff0c;相关文章发布在 Compose 动画 专栏里。系统性学完Compose动画后&#xff0c;又对此做了系统性的回顾&#xff0c;抽取其比较重要的部分&#xff0c;希望能帮助大家快速入门Compose动画&#xff0c;所…

ChatGPT新突破:打造自己的智能机器人控制系统

&#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是Zeeland&#xff0c;全栈领域优质创作者。&#x1f4dd; CSDN主页&#xff1a;Zeeland&#x1f525;&#x1f4e3; 我的博客&#xff1a;Zeeland&#x1f4da; Github主页: Undertone0809 (Zeeland) (github.com)&…

【论文速览】根据人脑fMRI信号重建图像 Image Reconstruction from human brain activity

文章目录 前言文章一研究背景主要方法部分实验结果总结与思考参考资料 文章二研究背景主要方法部分实验结果总结与思考 前言 人类的视觉神经系统对于真实世界的视觉刺激有着非凡的感知与理解能力&#xff0c;比如我们能够准确地识别物体距离和三维几何关系等&#xff0c;这是当…