C++的算法:Dijkstra算法与Floyd算法的原理及应用

        在计算机科学中,图论是一个重要的分支,它涉及到网络、路径查找、最短路径等多种问题。Dijkstra算法和Floyd算法是图论中常用的两种算法,分别用于单源最短路径问题和所有顶点对之间的最短路径问题。下面我们将详细解释这两种算法的原理,并通过实例展示其应用。

一、Dijkstra算法

        Dijkstra算法用于解决带权重的有向图或无向图中的单源最短路径问题。该算法的基本思想是以起始点为中心向外层层扩展,直到扩展到终点为止。

        原理:

        1. 初始化:将所有节点的距离设为无穷大(除了起始节点设为0)。
        2. 选择当前距离最小的节点作为扩展节点。
        3. 更新该节点所有邻居节点的距离。
        4. 重复步骤2和3,直到所有节点都被处理过。

        示例:

        假设我们有一个带权重的无向图,起始节点为A,目标为D。边的权重表示两点之间的距离。

        A---1---B---3---C
        |       |
        4       2
        |       |
        E---5---D

        代码如下。

#include <iostream>
#include <vector>
#include <limits>using namespace std;void dijkstra(vector<vector<pair<int, int>>>& graph, int start) {int numVertices = graph.size();vector<int> distances(numVertices, numeric_limits<int>::max());distances[start] = 0;vector<bool> visited(numVertices, false);for (int count = 0; count < numVertices - 1; count++) {int minDist = numeric_limits<int>::max(), minIndex;for (int vertex = 0; vertex < numVertices; vertex++)if (distances[vertex] <= minDist && !visited[vertex])minDist = distances[vertex], minIndex = vertex;visited[minIndex] = true;for (auto neighbor : graph[minIndex]) {int neighborIndex = neighbor.first;int weight = neighbor.second;if (!visited[neighborIndex] && distances[minIndex] != numeric_limits<int>::max() &&distances[minIndex] + weight < distances[neighborIndex])distances[neighborIndex] = distances[minIndex] + weight;}}// 输出最短路径for (int i = 0; i < numVertices; i++)cout << "Distance from start to " << i << " is " << distances[i] << endl;
}int main() {vector<vector<pair<int, int>>> graph = {{{1, 1}, {4, 4}},{{0, 1}, {2, 3}, {3, 5}},{{1, 3}},{{1, 2}, {2, 5}},{{1, 4}, {3, 5}}};dijkstra(graph, 0);return 0;
}

        运行这段代码,我们得到从A到其他所有节点的最短距离。        

        应用:

        1. 地图应用中计算两点之间的最短路径。
        2. 网络路由协议中计算最佳路径。
        3. 物流管理中计算最低成本的运输路径。

二、Floyd算法     

        Floyd算法用于计算图中所有顶点对之间的最短路径。该算法基于动态规划的思想,通过迭代更新顶点对之间的最短路径。

        原理:

        1. 初始化:对于任意两个顶点i和j,如果它们之间存在一条边,则dist[i][j]为该边的权重;否则dist[i][j]为无穷大。对于每个顶点i,dist[i][i]为0。
        2. 对于每一对顶点k和i,遍历所有顶点j,如果通过顶点k从i到j的路径比已知的路径更短,则更新dist[i][j]。
        3. 重复步骤2,直到dist数组不再发生变化。

        示例:

        以下是一个简单的加权有向图,我们要求出所有顶点对之间的最短路径。

A--3--B
|     |
5\    | 2/
 |     v
C----1----D
 \   /|
  4 / |
   E--1--F

代码如下。

#include <iostream>
#include <vector>
#include <climits>using namespace std;void floyd(vector<vector<int>>& graph, int V) {vector<vector<int>> dist(V, vector<int>(V, INT_MAX));// 初始化dist数组for (int i = 0; i < V; i++) {for (int j = 0; j < V; j++) {if (graph[i][j] != 0)dist[i][j] = graph[i][j];else if (i == j)dist[i][j] = 0;}}// Floyd算法的核心部分for (int k = 0; k < V; k++) {for (int i = 0; i < V; i++) {for (int j = 0; j < V; j++) {if (dist[i][k] != INT_MAX && dist[k][j] != INT_MAX &&dist[i][k] + dist[k][j] < dist[i][j])dist[i][j] = dist[i][k] + dist[k][j];}}}// 输出所有顶点对之间的最短距离for (int i = 0; i < V; i++) {for (int j = 0; j < V; j++) {if (dist[i][j] == INT_MAX)cout << "INF" << " ";elsecout << dist[i][j] << " ";}cout << endl;}
}int main() {int V = 6; // 顶点数量vector<vector<int>> graph = {{0, 3, INT_MAX, 5, INT_MAX, INT_MAX},{INT_MAX, 0, 2, INT_MAX, INT_MAX, 4},{INT_MAX, INT_MAX, 0, 1, INT_MAX, INT_MAX},{INT_MAX, INT_MAX, INT_MAX, 0, 1, INT_MAX},{INT_MAX, INT_MAX, INT_MAX, INT_MAX, 0, 1},{INT_MAX, INT_MAX, INT_MAX, INT_MAX, INT_MAX, 0}};floyd(graph, V);return 0;
}

        在这段代码中,`graph`矩阵用来存储图中所有顶点对之间的权重,其中`INT_MAX`表示两个顶点之间没有直接连接的边。        

        应用:

        1. 在计算机网络中计算任意两个节点之间的最短路径。
        2. 在物流规划中找出任意两点之间最经济、时间最短的路线。
        3. 旅行商问题(TSP)中,通过Floyd算法计算所有城市对之间的最短距离,进而寻找最短旅行路线。

        请注意,Floyd算法在稠密图中效率较高,而在稀疏图中可能不如Dijkstra算法或其他算法效率高。在实际应用中,需要根据图的特性选择合适的算法。

        综上所述,Dijkstra算法和Floyd算法在解决图论中的最短路径问题方面各有其特点和应用场景。通过理解它们的原理和实现方式,我们可以更好地应用它们来解决实际问题。

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

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

相关文章

Web LLM 攻击技术

概述 在ChatGPT问世以来&#xff0c;我也尝试挖掘过ChatGPT的漏洞&#xff0c;不过仅仅发现过一些小问题&#xff1a;无法显示xml的bug和错误信息泄露&#xff0c;虽然也挖到过一些开源LLM的漏洞&#xff0c;比如前段时间发现的Jan的漏洞&#xff0c;但是不得不说传统漏洞越来…

快速入门链路追踪sleuth整合zipkin(代码演示)

1、演示项目背景 2、pom.xml 3、启动项目 4、测试 5、保存数据到数据库 6、通过mq保存数据到mysql 7、通过mq保存数据到es 1、演示项目背景 下载zipkin&#xff0c;建议使用2.x版本的&#xff0c;3.x版本的要求jdk高版本。如果自己是1.8&#xff0c;就下载2.x的 下载地…

mysql数据库安装_修改密码_忘记密码(修改)

mysql安装_ 忘记密码_找回密码 1.mysql安装 安装包准备好&#xff0c;删除cos7自带的 mysql rpm -qa | grep -i -E mysql\|mariadb | xargs -n1 sudo rpm -e --nodeps2&#xff09;将安装包和JDBC驱动上传到/opt/module/mysql&#xff0c;共计**6 **个 01_mysql-community-…

SD-WAN与IPSec的对比

在现代企业中&#xff0c;随着网络环境的日益复杂&#xff0c;SD-WAN和IPSec作为两种关键的网络技术&#xff0c;各有其独特的优势和应用场景。那么&#xff0c;SD-WAN和IPSec究竟有什么不同&#xff1f;企业在不同情况下应该选择哪种技术呢&#xff1f; SD-WAN和IPSec的基本概…

一文看懂企业FTP服务器替代解决方案

FTP (File Transfer Protocol) 是一种用于在计算机网络上传输文件的协议。它基于客户端-服务器模型&#xff0c;用户可以通过一个支持FTP协议的客户端程序连接到远程FTP服务器&#xff0c;然后上传或下载文件。 FTP虽然是一种广泛使用的文件传输协议&#xff0c;但它也存在一些…

php实现抖音小程序支付

开发者发起下单_小程序_抖音开放平台 第一步、抖音小程序发起支付 tt.pay_小程序_抖音开放平台 前端提交订单数据到后端接口&#xff0c;然后使用 tt.pay发起支付 请求参数 属性 类型 必填 说明 order_id string 是 担保交易服务端订单号 order_token string 是 …

cad图纸防泄密 :数据保护策略

在数字化时代&#xff0c;CAD图纸是工程设计行业的重要资产&#xff0c;它们承载了设计师的心血和创新成果同时也具有较大的经济价值。然而&#xff0c;随着网络技术的发展&#xff0c;图纸泄露的风险也日益增加&#xff0c;这不仅可能导致经济损失&#xff0c;还可能对企业的品…

QComboBox条目可选择状态

有时候下拉框需要根据情况&#xff0c;将某些条目设为不可点击状态&#xff0c;或者动态切换为可点击状态&#xff0c;可采用以下方法。 //item1可选ui->comboBox->setItemData(0, QVariant(-1), Qt::UserRole-1);//item2不可选ui->comboBox->setItemData(1, QVari…

4线SPI和3线SPI的区别记录

SPI比较混乱&#xff0c;主要是没有标准的协议&#xff0c;只有moto的事实标准。所以衍生出多个版本&#xff0c;但没有本质的差异。 常见的SPI信号有&#xff1a;SS片选、SCK同步时钟、MISO、MOSI&#xff08;也有叫SDI、SDO的&#xff09;数据输入和输出&#xff0c;还的有包…

树莓派4B_OpenCv学习笔记3: 系统自动更新时间_测试CSI摄像头_安装OpenCv_4.6(未成功编译源码)_备份树莓派镜像

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本文我只是安装了OpenCv 4.6&#xff0c;但编译源码失败了&#xff01;有关 OpenCv 部分仅做笔记暂存&#xff01; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令…

python ---使用python操作mysql ---> pymysql

本章内容: 1:能够完成从MySQL中读取出数据; [重点] 查询: execute()、fetchall() 2:能够将数据写入MySQL数据库。 [重点] 插入数据: execute() sql insert into xxx [掌握]pymysql模块的安装 目标&#xff1a;了解如何安装pymysql模块&#xff1f; 当要使用Python和M…

怎么避免电脑磁盘数据泄露?磁盘数据保护方法介绍

电脑磁盘是电脑存储数据的基础&#xff0c;而为了避免磁盘数据泄露&#xff0c;我们需要保护电脑磁盘。下面我们就来了解一下磁盘数据保护的方法。 磁盘加密 磁盘加密可以通过专业的加密算法来加密保护磁盘数据&#xff0c;避免电脑磁盘数据泄露。在这里小编推荐使用文件夹只读…

【 k8s 标签与选择器 】

一、标签&#xff08;Label&#xff09; 用于给Kubernetes资源&#xff08;如Pod、Service、Deployment等&#xff09;打上自定义的键值对标识。以便更方便地管理和操作这些资源。 在各类资源的 metadata.labels 中进行配置。可以通过改配置文件的方式打标签。 apiVersion: v1…

python记录之元组

一、元组简介 元组&#xff08;Tuple&#xff09;是Python中的一个内置数据类型&#xff0c;用于存储一系列不可变&#xff08;immutable&#xff09;的元素。与列表&#xff08;List&#xff09;相似&#xff0c;元组也是有序的集合&#xff0c;但元组一旦创建就不能被修改&a…

10分钟Apache Kylin快速入门

Apache Kylin的入门教程可以分为以下几个主要步骤&#xff0c;下面将按照这些步骤进行详细的解释和归纳&#xff1a; 一、环境准备 操作系统&#xff1a;Kylin推荐在Linux系统上运行&#xff0c;尤其是CentOS 6.5或Ubuntu 16.0.4。Java环境&#xff1a;需要安装Java 1.8或更高…

Axios 源码中拦截器的实现

今天构建了一个新项目的架子&#xff0c;想着自己文章里好像没有对Axios源码的文章。今天对其中响应和请求的拦截器的Axios源码记录一下 Axios 的拦截器实现基于 Axios 的核心原理&#xff0c;即 Axios 实例是一个包含请求和响应拦截器堆栈的对象。当发出请求或接收响应时&…

E: Unable to locate package ros-kinetic-usb-cam

mkdir -p USB/src && cd USB/src catkin_init_workspace git clone https://github.com/bosch-ros-pkg/usb_cam.git cd .. catkin_make source devel/setup.bash echo "source ~/USB/devel/setup.bash" >> ~/.bashrc source ~/.bashrc 编译过程报错&…

yum进阶——配置yum源

一、yum概述 yum的主要作用 解决依赖关系 自动安装 自动升级 各个系统中的安装软件服务 CentOS7 &#xff1a;yum -y 安装 rpm包 CentOS8 &#xff1a;dnf&#xff08;yum的升级版&#xff09;&#xff0c; Ubantu(22.04) &#xff1a;apt -y 安装&#xff0c;安装源为/…

对换与覆盖

目录 多道程序环境下的对换技术 对换技术的基本思想 对换技术的目标 对换技术的实现 对换技术的挑战 对换技术的改进 对换区的管理 对换区的分配 对换区的位置 对换区的大小 对换策略 多层次对换区管理 进程的换出与换入 1. 换出&#xff08;Swapping Out&#xf…

vue面试题2-根据以下问题回答

以下是针对提供的关于Vue的问题的回答&#xff1a; Vue的基本原理&#xff1a; Vue.js是一个流行的JavaScript框架&#xff0c;用于构建用户界面和单页面应用。其基本原理包括响应式数据、模板、组件系统、指令、生命周期钩子和虚拟DOM。 双向数据绑定的原理&#xff1a; Vue通…