最短路径-Dijkstra算法与Floyd算法

2023-11-18

最短路径-Dijkstra算法与Floyd算法

原文:https://www.cnblogs.com/smile233/p/8303673.html

一、最短路径

  ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径。

 

 

 

 

AE:1    ADE:2   ADCE:3   ABCE:3

  ②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径。 

AE:100   ADE:90   ADCE:60   ABCE:70

  ③单源点最短路径问题

  问题描述:给定带权有向图G=(V, E)和源点v∈V,求从v到G中其余各顶点的最短路径。

  应用实例——计算机网络传输的问题:怎样找到一种最经济的方式,从一台计算机向网上所有其它计算机发送一条消息。

  ④每一对顶点之间的最短路径

  问题描述:给定带权有向图G=(V, E),对任意顶点vi,vj∈V(i≠j),求顶点vi到顶点vj的最短路径。

  解决办法1:每次以一个顶点为源点,调用Dijkstra算法n次。显然,时间复杂度为O(n3)。 解决办法2:弗洛伊德提出的求每一对顶点之间的最短路径算法——Floyd算法,其时间复杂度也是O(n3),但形式上要简单些。

二、Dijkstra算法

  ①基本思想:设置一个集合S存放已经找到最短路径的顶点,S的初始状态只包含源点v,对vi∈V-S,假设从源点v到vi的有向边为最短路径。以后每求得一条最短路径v, …, vk,就将vk加入集合S中,并将路径v, …, vk , vi与原来的假设相比较,取路径长度较小者为最短路径。重复上述过程,直到集合V中全部顶点加入到集合S中。

  ②设计数据结构 :

  1、图的存储结构:带权的邻接矩阵存储结构 。

  2、数组dist[n]:每个分量dist[i]表示当前所找到的从始点v到终点vi的最短路径的长度。初态为:若从v到vi有弧,则dist[i]为弧上权值;否则置dist[i]为∞。

  3、数组path[n]:path[i]是一个字符串,表示当前所找到的从始点v到终点vi的最短路径。初态为:若从v到vi有弧,则path[i]为vvi;否则置path[i]空串。

  4、数组s[n]:存放源点和已经生成的终点,其初态为只有一个源点v。

  ③Dijkstra算法——伪代码

 

1 1. 初始化数组dist、path和s;
2 2. while (s中的元素个数<n)
3      2.1 在dist[n]中求最小值,其下标为k;
4      2.2 输出dist[j]和path[j];
5      2.3 修改数组dist和path;
6      2.4 将顶点vk添加到数组s中;

 

   ④C++代码实现

 

 1 #include<iostream>
 2 #include<fstream>
 3 #include<string>
 4 using  namespace std;
 5 #define MaxSize  10
 6 #define MAXCOST 10000
 7 // 图的结构
 8 template<class T>
 9 struct Graph
10 {
11     T vertex[MaxSize];// 存放图中顶点的数组
12     int arc[MaxSize][MaxSize];// 存放图中边的数组
13     int vertexNum, arcNum;// 图中顶点数和边数
14 };
15 // 最短路径Dijkstra算法
16 void Dijkstra(Graph<string> G,int v)
17 {
18     int dist[MaxSize];//  i到j的路径长度
19     string path[MaxSize];// 路径的串
20     int s[MaxSize];// 已找到最短路径的点的集合
21     bool Final[MaxSize];//Final[w]=1表示求得顶点V0至Vw的最短路径
22     // 初始化dist\path
23     for (int i = 0; i < G.vertexNum; i++)
24     {
25         Final[i] = false;
26         dist[i] = G.arc[v][i];
27         if (dist[i] != MAXCOST)
28             path[i] = G.vertex[v] + G.vertex[i];
29         else
30             path[i] = " ";        
31     }
32     s[0] = v; // 初始化s
33     Final[v] = true;
34     int num = 1;
35     while (num < G.vertexNum)
36     {
37         // 在dist中查找最小值元素
38         int k = 0,min= MAXCOST;
39         for (int i = 0; i < G.vertexNum; i++)
40         {
41             if (i == v)continue;
42             if (!Final[i] && dist[i] < min)
43             {
44                 k = i;
45                 min = dist[i];
46             }                
47         }
48         cout << dist[k]<<path[k]<<endl;
49         s[num++] = k;// 将新生成的结点加入集合s
50         Final[k] = true;
51         // 修改dist和path数组
52         for (int i = 0; i < G.vertexNum; i++)
53         {
54             if (!Final[i]&&dist[i] > dist[k] + G.arc[k][i])
55             {
56                 dist[i] = dist[k] + G.arc[k][i];
57                 path[i] = path[k] + G.vertex[i];
58             }
59         }
60     }
61 }
62 int main()
63 {
64     // 新建图
65     Graph<string> G;
66     string temp[]= { "v0","v1","v2","v3","v4" };
67     /*int length = sizeof(temp) / sizeof(temp[0]);
68     G.vertexNum = length;
69     G.arcNum = 7;*/
70     ifstream in("input.txt");
71     in >> G.vertexNum >> G.arcNum;
72     // 初始化图的顶点信息
73     for (int i = 0; i < G.vertexNum; i++)
74     {
75         G.vertex[i] = temp[i];
76     }
77     //初始化图G的边权值
78     for (int i =0; i <G.vertexNum; i++)
79     {
80         for (int j = 0; j <G.vertexNum; j++)
81         {
82             G.arc[i][j] = MAXCOST;
83         }
84     }
85     for (int i = 0; i < G.arcNum; i++)
86     {
87         int m, n,cost;
88         in >> m >> n >> cost;
89         G.arc[m][n] = cost;
90     }
91     Dijkstra(G, 0);
92     system("pause");
93     return 0;
94 }

 

 

// input.txt
1 5 7
2 0 1 10
3 0 3 30
4 0 4 100
5 1 2 50
6 2 4 10
7 3 2 20
8 3 4 60

 

三、Floyd算法

  ①基本思想:对于从vi到vj的弧,进行n次试探:首先考虑路径vi,v0,vj是否存在,如果存在,则比较vi,vj和vi,v0,vj的路径长度,取较短者为从vi到vj的中间顶点的序号不大于0的最短路径。在路径上再增加一个顶点v1,依此类推,在经过n次比较后,最后求得的必是从顶点vi到顶点vj的最短路径。

  ②设计数据结构

  1、图的存储结构:带权的邻接矩阵存储结构  。

  2、数组dist[n][n]:存放在迭代过程中求得的最短路径长度。迭代公式:

          

  3、数组path[n][n]:存放从vi到vj的最短路径,初始为path[i][j]="vivj"。

  ③C++代码实现

 

 1 #include<iostream>
 2 #include<fstream>
 3 #include<string>
 4 using  namespace std;
 5 #define MaxSize  10
 6 #define MAXCOST 10000
 7 int dist[MaxSize][MaxSize];// 存放在迭代过程中求得的最短路径
 8 string path[MaxSize][MaxSize];// vi到vj的最短路径
 9 // 图的结构
10 template<class T>
11 struct Graph
12 {
13     T vertex[MaxSize];// 存放图中顶点的数组
14     int arc[MaxSize][MaxSize];// 存放图中边的数组
15     int vertexNum, arcNum;// 图中顶点数和边数
16 };
17 void Floyd(Graph<string> G)
18 {    
19     // 初始化
20     for(int i=0;i<G.vertexNum;i++)
21         for (int j = 0; j < G.vertexNum; j++)
22         {
23             if (i == j) { dist[i][j] = 0; path[i][j] = ""; }
24             dist[i][j] = G.arc[i][j];
25             if (dist[i][j] != MAXCOST)
26                 path[i][j] = G.vertex[i] + G.vertex[j];
27             else
28                 path[i][j] = " ";
29         }
30     // 进行n次迭代
31     for(int k=0;k<G.vertexNum;k++)
32         for(int i=0;i<G.vertexNum;i++)
33             for (int j = 0; j < G.vertexNum; j++)
34                 if (dist[i][k] + dist[k][j] < dist[i][j])
35                 {
36                     dist[i][j] = dist[i][k] + dist[k][j];
37                     path[i][j] = path[i][k] + path[k][j];
38                 }            
39 }
40 int main()
41 {
42     int i, j, cost;
43     Graph<string> G;// 存放图的信息
44     ifstream in("input.txt");
45     in >> G.vertexNum >> G.arcNum;
46     string temp[] = { "a","b","c" };    
47     // 初始化图的顶点信息
48     for (int i = 0; i < G.vertexNum; i++)
49     {
50         G.vertex[i] = temp[i];
51     }
52     //初始化图G
53     for (i = 0; i < G.vertexNum; i++)
54     {
55         for (j = 0; j < G.vertexNum; j++)
56         {
57             G.arc[i][j] = MAXCOST;
58         }
59     }
60     //构建图G
61     for (int k = 0; k <G.arcNum; k++)
62     {
63         in >> i >> j >> cost;
64         G.arc[i][j] = cost;
65     }
66     Floyd(G);
67     for (i = 0; i < G.vertexNum; i++)
68     {
69         for (j = 0; j < G.vertexNum; j++)
70         {
71             if (i != j)
72             {
73                 cout << "顶点" << i << "到顶点" << j << "的最短路径长度为" << dist[i][j] << endl;                                
74                 cout << "具体路径为:" << path[i][j] << endl;
75             }
76         }
77     }
78     system("pause");
79     return 0;
80 }

 

 

// input.txt
3 5
0 1 4
1 0 6
0 2 11
2 0 3
1 2 2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最短路径-Dijkstra算法与Floyd算法 的相关文章

  • 《Blurriness-guided Unsharp Masking》阅读笔记

    Unsharp Masking 反锐化掩模 将原图像通过反锐化掩模进行模糊预处理 相当于采用低通滤波 后与原图逐点做差值运算 然后乘上一个修正因子再与原图求和 以达到提高图像中高频成分 增强图像轮廓的目的 这篇文章提出了一个基于模糊作为导向
  • 【文文殿下】【SDOI2013】随机数生成器 题解

    题意 给你个随机数生成器 f x a f x 1 b mod p 给你初始信息 a b t p f 1 问你几次等于 t 如果不等于输出 1 题解 f n a f n 1 b f n c a n 1 frac b a n 1 a 1 tex
  • Linux系统服务权限维持

    usr lib systemd system linux How to remove systemd services Super User VirusTotal File 334e828a09bd64abb9a4f70256f4d2f8f
  • 创新生产力的新引擎

    随着科技的飞速发展 人工智能 AI 已成为当今时代的一大热点 近年来 生成式AI的崛起 特别是在自然语言处理 NLP 领域的突破 对传统搜索引擎 推荐系统 语言翻译等领域产生了深远的影响 CHAT GPT作为生成式AI的代表之一 更是引领了

随机推荐

  • java中的四种权限修饰符

    因为缺省情况下只能在同包中访问 所以缺省也叫包访问权限 要注意的是 当使用protected修饰父类的成员或者方法 在不同包下访问该父类的资源时 只有使用子类对象才可以去访问 声明一个父类的对象是无法访问该资源的
  • unity 3D获取当前物体得坐标

    unity 3D获取当前物体得坐标 与物体绑定好 public class location MonoBehaviour Start is called before the first frame update public GameOb
  • 2022年“网络安全”赛项驻马店市赛选拔赛 任务书

    2022年 网络安全 赛项驻马店市赛选拔赛 一 竞赛时间 共计3小时 二 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段单兵模式系统渗透测试 任务一 Windows操作系统渗透测试 100分钟 100 任务二 Linux操
  • Linux 中如何使用 Aria2 下载文件

    Aria2是一个免费的开源轻量级多协议命令行实用程序 可以从Internet上下载文件 它支持各种协议 例如HTTP HTTPS FTP甚至BitTorrent Aria2可在Windows Linux和Mac OSX上运行 主要特征 以下
  • RBAC新解:基于资源的权限管理(Resource-Based Access Control)

    原文地址 转载地址 本文讨论以角色概念进行的权限管理策略及主要以基于角色的机制进行权限管理是远远不够的 同时我将讨论一种我认为更好的权限管理方式 什么是角色 当说到程序的权限管理时 人们往往想到角色这一概念 角色是代表一系列可执行的操作或责
  • Sqlilabs-25a

    本关卡和 25 关的区别在于连单引号都省去了 http sqlilabs Less 25a id 1 报错 http sqlilabs Less 25a id 1 正常 http sqlilabs Less 25a id 1 ordery
  • go学习———第二阶段

    go 第二阶段学习 一 函数 1 函数基本用法 函数的参数与返回值 不定参数的传递 2 函数类型 递归函数 回调函数 匿名函数 3 defer的用法 先入后出 4 闭包与匿名函数 二 指针变量 三 数组与切片 1 数组 2 切片 随机数 四
  • 安装tiny-cuda-nn时报错RuntimeError: Could not locate a supported Microsoft Visual C++ installation

    问题描述 按照官方教程安装nerf studio 运行命令pip install git https github com NVlabs tiny cuda nn subdirectory bindings torch安装tiny cuda
  • 为什么我们要进行博客营销

    首先我们要了解博客产生的背景 在一种web2 0时代 为了发表一些看法 分享知识和经验 同时增加创造性和自主性 而专门设计了很大类的博客 有很多知名的博客网 国内如新浪博客 网易博客 阿里巴巴博客等 而博客营销可以通过博客创作一些文章 或者
  • React 从零开始学习(八)—— 决出胜负

    有两个玩家参与之后 就需要判断胜负 以及游戏何时结束 在 Board js 文件中添加 calculateWinner 方法来计算判断游戏 传入 squares 是一个长度为 9 的数组 function calculateWinner s
  • Go 1.19.3 context原理简析

    Context context Context一般用作函数或方法的第一个参数 其作用为管控协程在用户侧 生命周期 它是线程安全的 在多个goroutine之间可以任意调用其方法 不需考虑锁的问题 原理简析 context的结构是一棵以Bac
  • scrapy mysql的同步插入与异步插入

    主要代码是在Pipeline中进行编写 上完整代码 同步插入代码 同步插入 class MysqlPipeline2 object 同步操作 def init self 建立连接 self conn pymysql connect loca
  • opencv实现答题卡识别

    识别答题卡 import cv2 import numpy as np def showImg img name img cv2 imshow img name img cv2 waitKey cv2 destroyAllWindows d
  • VMware下载与安装

    VMware的简介 VMWare虚拟机软件是一个 虚拟PC 软件 它使你可以在一台机器上同时运行二个或更多Windows DOS LINUX系统 与 多启动 系统相比 VMWare采用了完全不同的概念 多启动系统在一个时刻只能运行一个系统
  • 扩散模型大杀器 ControlNet 解析

    Controlnet的介绍 1 论文信息 标题 Adding Conditional Control to Text to Image Diffusion Models 作者 Lvmin Zhang Maneesh Agrawala 原文链
  • Object.entries()方法使用详解

    一 概述 对象的数据处理方法 我们熟知的有很多 比如Object keys Object values for in等 本文将其与其它常见使用方法进行对比 详细解析其特性 二 对比 for in Object entries 方法的优势 1
  • Python计算过去周末的方法

    在Python中 我们可以使用datetime模块来计算过去的周末数量 datetime模块提供了各种日期和时间相关的函数和类 使我们可以轻松地处理日期和时间 首先 我们需要导入datetime模块 import datetime 然后 我
  • Vue自定义指令 「干货」

    在 Vue 除了核心功能默认内置的指令 v model 和 v show Vue 也允许注册自定义指令 它的作用价值在于当开发人员在某些场景下需要对普通 DOM 元素进行操作 Vue 自定义指令有全局注册和局部注册两种方式 先来看看注册全局
  • springboot修改端口号的两种方式

    前言 springboot默认的端口号为8080 端口号的配置有两种方式 一种是在配置文件application properties中 另一种是在配置文件application yml中 1 第一种方式 修改配置文件application
  • 最短路径-Dijkstra算法与Floyd算法

    最短路径 Dijkstra算法与Floyd算法 原文 https www cnblogs com smile233 p 8303673 html 一 最短路径 在非网图中 最短路径是指两顶点之间经历的边数最少的路径 AE 1 ADE 2 A