c++实现dijskstra算法

news2024/7/4 6:18:10

在这里插入图片描述
我一开始写成了最小生成树的代码,最小生成树一直在选最小的那条边,对每个节点来说,它到原点的距离不一定是最近的。

代码

#include<iostream>
using namespace std;
#include<list>
#include<vector>

class Node
{
public:
	Node(int name):_name(name){}

	void set_father(int father) {
		_father = father;
	}
	int get_father()
	{
		return _father;
	}

private:
	int _name;
	int _father = -1;
};

int main()
{
	const int numNode = 7;
	int weights[numNode + 1][numNode+1];
	for (int i = 0; i < numNode + 1; ++i)
	{
		for (int j = 0; j < numNode + 1; ++j)
		{
			if (i == j) weights[i][j] = 0;
			else weights[i][j] = INT_MAX / 2 - 1;
		}
	}
	weights[1][2] = 12;
	weights[2][1] = 12;

	weights[2][3] = 10;
	weights[3][2] = 10;

	weights[3][4] = 3;
	weights[4][3] = 3;

	weights[4][5] = 4;
	weights[5][4] = 4;

	weights[5][6] = 2;
	weights[6][5] = 2;

	weights[6][7] = 9;
	weights[7][6] = 9;

	weights[1][7] = 14;
	weights[7][1] = 14;

	weights[1][6] = 16;
	weights[6][1] = 16;

	weights[6][2] = 7;
	weights[2][6] = 7;

	weights[3][5] = 5;
	weights[5][3] = 5;

	weights[5][7] = 8;
	weights[7][5] = 8;

	Node one(1);
	Node two(2);
	Node three(3);
	Node four(4);
	Node five(5);
	Node six(6);
	Node seven(7);

	list<int> visited_nodes;

	// 求各点到点4的最短距离,并输出最短路径
	int distanceTo4[numNode + 1];
	bool visited[numNode + 1];
	
	for (int i = 0; i < numNode + 1; ++i) // 最短距离初始化
	{
		distanceTo4[i] = INT_MAX / 2 - 1;
	}
	distanceTo4[4] = 0;
	

	for (int i = 0; i < numNode + 1; ++i) // 是否已经访问初始化
	{
		visited[i] = false;
	}
	visited[4] = true;

	int updateIndex = 4;
	visited_nodes.push_back(updateIndex);
	
	while (visited_nodes.empty() == false)
	{
		int preUpdateIndex = visited_nodes.front();
		visited_nodes.pop_front();

		for (int i = 1; i < numNode + 1; ++i)
		{
			if (weights[i][preUpdateIndex] < 1000) 
			{
				// 说明是preUpdateIndex的邻居
				int tmpDistance = min(
					distanceTo4[i],
					distanceTo4[preUpdateIndex] + weights[i][preUpdateIndex]);
				if (tmpDistance == (distanceTo4[preUpdateIndex] + weights[i][preUpdateIndex]) && distanceTo4[i]!=tmpDistance)
				{
					// 说明更新了
					switch (i)
					{
					case 1:
					{
						one.set_father(preUpdateIndex);
					}break;
					case 2:
					{
						two.set_father(preUpdateIndex);
					}break;
					case 3:
					{
						three.set_father(preUpdateIndex);
					}break;
					case 4:
					{
						four.set_father(preUpdateIndex);
					}break;
					case 5:
					{
						five.set_father(preUpdateIndex);
					}break;
					case 6:
					{
						six.set_father(preUpdateIndex);
					}break;
					case 7:
					{
						seven.set_father(preUpdateIndex);
					}break;
					default: break;
					}
				
					visited_nodes.push_back(i);
				}

				distanceTo4[i] = tmpDistance;
			}

		}

	}

	for (int i = 1; i < numNode + 1; ++i)
	{
		cout << distanceTo4[i] << " ";
	}
	cout << endl;
	
	// 打印从1->4的最短路径
	vector<int> path14;
	path14.push_back(1);
	Node *node;
	node = &one;
	while (true)
	{
		int index = node->get_father();	
		if (index == -1) break;

		path14.push_back(index);
		
		switch (index)
		{
		case 1:
			node = &one; break;
		case 2:
			node = &two; break;
		case 3:
			node = &three; break;
		case 4:
			node = &four; break;
		case 5:
			node = &five; break;
		case 6:
			node = &six; break;
		case 7:
			node = &seven; break;
		default: break;
		}
		
	}
	
	for (int i = 0; i < path14.size(); ++i)
	{
		if (i != 0) {
			cout << "->" << path14[i];
		}
		else {
			cout << path14[i];
		}
	}
	cout << endl;


	return 0;
}

结果

在这里插入图片描述

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

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

相关文章

RocketMQ事务消息 超时重发还是原来的消息吗?

以下面的一个demo例子来分析一下&#xff0c;探索RocketMQ事务消息原理。 public static final String PRODUCER_GROUP "tran-test";public static final String DEFAULT_NAMESRVADDR "127.0.0.1:9876";public static final String TOPIC "Test&qu…

如何理解Quadratic Weighted Kappa?

Motivation 假定我们现在有 N N N个作文样例&#xff0c;以及它们对应的人类评分和GPT评分。评分一共有 C C C个互斥类别&#xff0c;分别是{0,1,2,3}。现在我们要衡量人类评分和GPT评分的一致性。 一个很直观的想法是&#xff0c;画出混淆矩阵&#xff0c;然后将对角线上的值…

Linux Centos7安装后,无法查询到IP地址,无ens0,只有lo和ens33的解决方案

文章目录 前言1 查看network-scripts目录2 创建并配置 ifcfg-ens33 文件3 禁用NetworkManager4 重新启动网络服务总结 前言 在VMware中&#xff0c;安装Linux centos7操作系统后&#xff0c;想查询本机的IP地址&#xff0c;执行ifconfig命令 ifconfig结果如下&#xff1a; 结…

吴恩达《机器学习》1-5:模型描述

一、单变量线性回归 单变量线性回归是监督学习中的一种算法&#xff0c;通常用于解决回归问题。在单变量线性回归中&#xff0c;我们有一个训练数据集&#xff0c;其中包括一组输入特征&#xff08;通常表示为&#x1d465;&#xff09;和相应的输出目标&#xff08;通常表示为…

UVa140 Bandwidth(带宽)

1、题目 2、题意 给出一个 n &#xff08; n ≤ 8 &#xff09; n&#xff08;n≤8&#xff09; n&#xff08;n≤8&#xff09;个结点的图G和一个结点的排列&#xff0c;定义结点 i i i 的带宽 b ( i ) b(i) b(i) 为 i i i 和相邻结点在排列中的最远距离&#xff0c;而所…

Ansible上通过roles简化playbook演示介绍

目录 一.roles介绍 1.作用 2.role的目录结构 3.role和tasks的执行优先级顺序 二.自定义一个httpd的角色 1.完整目录结构展示 2.主要的各个目录配置 &#xff08;1&#xff09;vars目录和templates目录 &#xff08;2&#xff09;tasks目录和handlers目录 &#xff08…

操作系统中套接字和设备独立性软件的关系

网络编程就是编写程序让两台联网的计算机相互交换数据。在我们不需要考虑物理连接的情况下&#xff0c;我们只需要考虑如何编写传输软件。操作系统提供了名为“套接字”&#xff0c;套接字是网络传输传输用的软件设备。 这是对软件设备的解释&#xff1a; 在操作系统中&#…

Unity ScrollView最底展示

Unity ScrollView最底展示 问题方案逻辑 问题 比如在做聊天界面的时候我们肯定会使用到ScrollView来进行展示我们的聊天内容&#xff0c;那么这个时候来新消息的时候就需要最底展示&#xff0c;我认为这里有两种方案&#xff1b; 一种是通过算法每一条预制体的高度*一共多少…

轮转数组(Java)

大家好我是苏麟 , 这篇文章是凑数的 ... 轮转数组 描述 : 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 题目 : 牛客 NC110 旋转数组: 这里牛客给出了数组长度我们直接用就可以了 . LeetCode 189.轮转数组 : 189. 轮…

Python---break关键字对for...else结构的影响

for循环中添加else结构 循环可以和else配合使用&#xff0c; else下方缩进的代码指的是当循环正常结束之后要执行的代码。 强调&#xff1a; 循环 正常结束&#xff0c;else之后要执行的代码。 非正常结束&#xff0c;其else中的代码是不会执行的。&#xff08;如遇到br…

类和对象(1):类,对象,this指针

面向过程和面向对象初步认识&#xff1a; C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出问题求解的步骤&#xff0c;用函数调用逐步解决。C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完成。…

【.NET Core】创建一个在后台运行的控制台程序(ConsoleApp)

文章目录 1. 添加Nuget包2. 修改Program.cs3. 添加TestService 借助.NET的通用主机&#xff08;IHostBuilder&#xff09;可以轻易创建一个可以执行后台任务的程序 1. 添加Nuget包 Microsoft.Extensions.Hosting 2. 修改Program.cs 通过Host获取IHostService&#xff0c;然…

SSD: Single Shot MultiBox Detector(2016.11)

文章目录 AbstractIntroduction此前本文贡献总结如下: The Single Shot Detector (SSD)SSD ModelMulti-scale feature maps for detectionConvolutional predictors for detectionDefault boxes and aspect ratiosTrainingMatching strategyTraining objectiveChoosing scales …

python---for循环结构中的else结构(是同级关系)

为什么需要在for循环中添加else结构 循环可以和else配合使用&#xff0c; else下方缩进的代码指的是当循环正常结束之后要执行的代码。 强调&#xff1a; 循环 正常结束&#xff0c;else之后要执行的代码。 非正常结束&#xff0c;其else中的代码是不会执行的。&#xf…

GienTech动态|入选软件和信息技术服务名牌企业;荣获城市数字化转型优秀案例;参加第四届深圳国际人工智能展

中电金信入选“2023第二届软件和信息技术服务名牌企业” 近日&#xff0c;中国电子信息行业联合会发布了“2023第二届软件和信息技术服务名牌企业”名单&#xff0c;中电金信入选。此名单发布原则&#xff0c;重点突出技术创新力。突出市场影响力&#xff0c;品牌建设良好&…

Leetcode刷题笔记--Hot81--90

1--打家劫舍III 主要思路&#xff1a; 基于从下到上的 dp 回溯法&#xff0c;每一个节点只有两种状态&#xff0c;dp[0]表示被打劫&#xff0c;dp[1]表示不被打劫&#xff1b; 当前节点被打劫时&#xff0c;其孩子只能都不被打劫&#xff1b;dp[0] left[1] right[1] cur->…

redis集群理论和搭建

目录 环境 一&#xff0c;安装和部署redis 1&#xff0c;安装 2&#xff0c;部署 ​编辑 3&#xff0c;允许非本机连接redis 二、主从模式 主从模式搭建&#xff1a; 三&#xff0c;哨兵模式 哨兵模式搭建 四&#xff0c;集群模式 架构细节: 心跳机制 集群模式搭建&#xff1a…

【NLP】word复制指定内容到新的word文档

目录 1.python代码 2.结果 需求&#xff1a; 复制word文档里的两个关键字&#xff08;例如“起始位置”到“结束位置”&#xff09;之间的内容到新的word文档。 前提&#xff1a;安装win32包&#xff0c;通过pip install pywin32命令直接安装。话不多说&#xff0c;直接上代码…

底层全部重构,小米澎湃OS完整系统架构公布

上周&#xff0c;雷军发文称小米全新操作系统澎湃 OS 正式版已完成封包&#xff0c;将逐步接替 MIUI。而后&#xff0c;又有网友曝光小米澎湃 OS 界面。 今日&#xff0c;雷军再度发表长文预热小米澎湃 OS&#xff0c;正式公布了完整系统架构。 据介绍&#xff0c;从架构设计之…

CSS基础入门03

目录 1.圆角矩形 1.1基本用法 1.2生成圆形 1.3生成圆角矩形 1.4展开写法 2.Chrome 调试工具--查看 CSS 属性 2.1打开浏览器 2.2标签页含义 2.3elements 标签页使用 3.元素的显示模式 3.1块级元素 3.2行内元素/内联元素 3.3行内元素和块级元素的区别 3.4改变显示模…