Floyd最短路(带路径输出)

摘要(以下内容来自百度)

Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。
该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。
简介编辑
在计算机科学中,Floyd-Warshall算法是一种在具有正或负边缘权重(但没有负周期)的加权图中找到最短路径的算法。算法的单个执行将找到所有顶点对之间的最短路径的长度(加权)。 虽然它不返回路径本身的细节,但是可以通过对算法的简单修改来重建路径。 该算法的版本也可用于查找关系R的传递闭包,或(与Schulze投票系统相关)在加权图中所有顶点对之间的最宽路径。
Floyd-Warshall算法是动态规划的一个例子,并在1962年由Robert Floyd以其当前公认的形式出版。然而,它基本上与Bernard Roy在1959年先前发表的算法和1962年的Stephen Warshall中找到图形的传递闭包基本相同,并且与Kleene的算法密切相关 在1956年)用于将确定性有限自动机转换为正则表达式。算法作为三个嵌套for循环的现代公式首先由Peter Ingerman在1962年描述。
该算法也称为Floyd算法,Roy-Warshall算法,Roy-Floyd算法或WFI算法。 [2]
核心思路编辑
路径矩阵
通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 [3]
从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。
采用松弛技术(松弛操作),对在i和j之间的所有其他点进行一次松弛。所以时间复杂度为O(n^3);
状态转移方程
其状态转移方程如下: map[i,j]:=min{map[i,k]+map[k,j],map[i,j]};
map[i,j]表示i到j的最短距离,K是穷举i,j的断点,map[n,n]初值应该为0,或者按照题目意思来做。
当然,如果这条路没有通的话,还必须特殊处理,比如没有map[i,k]这条路。
算法过程编辑
1,从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。
2,对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比已知的路径更短。如果是更新它。
把图用邻接矩阵G表示出来,如果从Vi到Vj有路可达,则G[i][j]=d,d表示该路的长度;否则G[i][j]=无穷大。定义一个矩阵D用来记录所插入点的信息,D[i][j]表示从Vi到Vj需要经过的点,初始化D[i][j]=j。把各个顶点插入图中,比较插点后的距离与原来的距离,G[i][j] = min( G[i][j], G[i][k]+G[k][j] ),如果G[i][j]的值变小,则D[i][j]=k。在G中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。
比如,要寻找从V5到V1的路径。根据D,假如D(5,1)=3则说明从V5到V1经过V3,路径为{V5,V3,V1},如果D(5,3)=3,说明V5与V3直接相连,如果D(3,1)=1,说明V3与V1直接相连。 [4]
时间复杂度与空间复杂度编辑
时间复杂度:O(n^3);
空间复杂度:O(n^2)
优缺点分析编辑
Floyd算法适用于APSP(All Pairs Shortest Paths,多源最短路径),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法,也要高于执行|V|次SPFA算法。
优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单。
缺点:时间复杂度比较高,不适合计算大量数据。 [5]

关键的路径输出

例如
1342501-20181218210020715-1344801765.png

具体看代码

代码

#include<bits/stdc++.h>
using namespace std;
const int inf=999999;
int mp[20][20],path[20][20];
int n,m;
void print(int a,int b){if(path[a][b]==-1) return;//因为开始初始化为-1,这里就可以避免相邻的再次输出 print(a,path[a][b]);//前半部 cout<<path[a][b]<<"-->";//输出该点 print(path[a][b],b);//后半部 
}
int main(){// freopen("in.txt","r",stdin);while(cin>>n>>m){memset(path,-1,sizeof(path));//初始化-1 for(int i=0;i<n;i++)for(int j=0;j<n;j++) if(i==j) mp[i][j]=0;else mp[i][j]=inf;int Start,End,dis;for(int i=0;i<m;i++){cin>>Start>>End>>dis;mp[Start][End]=dis;}//三层循环for(int k=0;k<n;k++){//第k个点进行松弛 for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(mp[i][j]>mp[i][k]+mp[k][j])//如果能够缩短就更新距离 {mp[i][j]=mp[i][k]+mp[k][j];path[i][j]=k;//记录能松弛的点 }} cout<<"The shortest path between vertices\n";for(int i=0;i<n;i++)for(int j=0;j<n;j++){if(mp[i][j]==inf){//两者不通 cout<<i<<' '<<j;cout<<" These two points cannot be reached\n\n"; continue;}cout<<i<<" to "<<j<<" shortest path is "<<mp[i][j]<<endl;cout<<"The specific path is\n";cout<<i<<"-->";print(i,j);cout<<j<<' ';cout<<endl<<endl;}
}
return 0;
} 
//输入数据
/*
10 14
0 1 45
0 2 35
0 3 50
1 2 20
1 5 90
1 8 70
2 4 50
3 4 50
5 6 20
5 7 50
5 8 50
6 0 40
6 3 40
9 8 35
*/ 

转载于:https://www.cnblogs.com/mch5201314/p/10139993.html

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

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

相关文章

CSS 小结笔记之清除浮动

浮动是一个非常好用的属性&#xff0c;但是有时会出现一些问题&#xff0c;需要进行清除浮动。例如 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…

jsp分割字符串并遍历

1、先引入JSTL库 <% taglib uri"http://java.sun.com/jsp/jstl/core" prefix"c"%> 2、分割字符串并遍历&#xff08;按“,”分割&#xff09; <c:forTokens items"${danger.imagesPath}" delims"," var"file"> …

linux shell 脚本 父子进程 等待子进程,SHELL父子进程分析

导言本节将就shell交互(脚本执行)过程中涉及子进程(subprocess)以及子SHELL(subshell)的部分&#xff0c;配以实例&#xff0c;进行说明。将详细讨论如下问题&#xff1a;subprocess和subshell是什么subprocess的产生过程是什么什么情况下会产生subprocess和subshellshell编程中…

百里香Spring测试的意见

我最近将其转换为thymeleaf &#xff0c;以便在基于Spring的Web应用程序中进行视图模板化&#xff0c;而不是jsp。 百里香叶文档中所有关于为什么百叶香叶在jsp上为何能保持水分的争论都被我肯定了。 除了能够预览模板之外&#xff0c;对我来说&#xff0c;主要原因之一是视图…

路由与交换--交换机常用配置及其实验案例

1 交换机常用配置命令 1.1 配置主机名与口令 Switch>enable Switch#config t Switch(config)#hostname SA SA(config)#enable password cisco&#xff08;明文&#xff09; SA(config)#enable secret cisco&#xff08;暗文&#xff09; SA(config)#exit SA#show running-co…

js使用工具将表单封装成json字符串传到后台,js截取字符串(学生笔记)

<script src"js/jquery.min.js"></script><script src"https://cdn.bootcss.com/jquery.serializeJSON/2.9.0/jquery.serializejson.js"></script><script>// / //原始版本// $("#1").click(function(){// …

linux自动启动network服务,Windows/Linux 创建开机启动服务

系统服务是一种应用程序类型&#xff0c;它在后台运行。服务应用程序通常可以在本地和通过网络为用户提供一些功能。有些软件无需安装解压就能使用&#xff0c;或者在安装时未向系统注册服务。如果我们需要开机启动&#xff0c;需要手动创建服务。Windows系统篇相对于在注册表中…

对 Vue 的理解(一)

一、什么是 Vue ? 首先&#xff0c;Vue 是一个 MVVM 框架&#xff0c;M -- 模型&#xff0c;就是用来定义驱动的数据&#xff0c;V -- 视图&#xff0c;是经过数据改变后的 html&#xff0c;VM -- 框架视图&#xff0c;就是用来实现双向绑定的中间桥梁。Vue.js 是采用数据劫持…

Nginx做前端Proxy时TIME_WAIT过多的问题

我们的DSP系统目前基本非凌晨时段的QPS都在10W以上&#xff0c;我们使用Golang来处理这些HTTP请求&#xff0c;Web服务器的前端用Nginx来做负载均衡&#xff0c;通过Nginx的proxy_pass来与Golang交互。由于nginx代理使用了短链接的方式和后端交互的原因&#xff0c;使得系统TIM…

JDK 8功能的可疑方面

我们大多数使用Java进行开发的人通常都热衷于JDK 8附带的功能和改进。 但是&#xff0c;最近有几篇文章指出了某些功能可能会被滥用和滥用&#xff0c;并可能在将来导致其他问题。 这些功能使我想起了J2SE 5中引入的自动装箱功能&#xff0c;虽然有其有用的情况&#xff0c;但是…

Xshell 基本使用方式 (1) -- 使用Xshell 连接 VMware下的linux系统

在VMware的虚拟机设置下的网络适配器设置成桥接模式&#xff0c;点击确定。 在终端中输入ifconfig命令查看IP 打开Xshell 新建会话 输入刚刚获取的IP地址&#xff0c;我的是219.219.198.225 如果点击右侧的用户身份验证 输入你的linux登录用户名以及密码 点击连接 可以看到已经…

linux 串口 qt,Linux-QT4.7 实现串口通信

在qt5版本以下&#xff0c;想要实现串口通信需要两个集成类&#xff0c;posix_qextserialport 和 qextserialbase&#xff0c;需要的可以移步到 下载点。在posix_qextserialport这个类中关于串口设置的定义很详细&#xff0c;常用的写法一般是Posix_QextSerialPort * myCom;myC…

JS实现2048

2048这个游戏是通过对二维数组的操作来实现的&#xff0c;其算法核心如下&#xff1a; &#xff08;以一行左移为例&#xff09; c从0开始&#xff0c;遍历当前行中的元素&#xff0c;到<CN-1&#xff08;CN是一个常量&#xff0c;表示的是游戏格子的列数&#xff09;结束&a…

django01

Django的下载与基本命令: 1、下载Django&#xff1a; pip3 install django 2、创建一个django project django-admin.py startproject mysite manage.py ----- Django项目里面的工具&#xff0c;通过它可以调用django shell和数据库等。    settings.py ---- 包含了项目的…

Maven和Java多版本模块

介绍 通常&#xff0c;项目具有最低Java版本要求&#xff0c;并且适用于其所有模块。 但是每条规则都有其例外&#xff0c;最近我偶然发现了以下问题。 我的一个开源项目对大多数模块要求使用Java 1.6&#xff0c;除了一个要求1.7版本的项目。 当集成具有与您自己的项目不同的…

鼠标样式设置

<span style"cursor:auto">浏览器设置的光标</span><br /> <span style"cursor:default">默认鼠标箭头</span> <span style"cursor:pointer">一只手的形状</span> <span style"cursor:text&…

如何在linux环境下安装kvm,如何在Linux发行版上安装和配置KVM和Open vSwitch?

在如今多租户模式的数据中心环境下&#xff0c;虚拟化技术正从传统的基于虚拟机管理程序的服务器虚拟化&#xff0c;扩展到网络虚拟化。在这种环境下&#xff0c;基于软件的虚拟交换机通常连同虚拟机管理程序一起部署在服务器上&#xff0c;串联起了不同虚拟机之间传送的流量。…

hanlp中的N最短路径分词

N-最短路径 是中科院分词工具NLPIR进行分词用到的一个重要算法&#xff0c;张华平、刘群老师在论文《基于N-最短路径方法的中文词语粗分模型》中做了比较详细的介绍。该算法算法基本思想很简单&#xff0c;就是给定一待处理字串&#xff0c;根据词典&#xff0c;找出词典中所有…

怎么在ReactNative里面使用Typescript

今天来搞一搞怎么搭建一个可以使用Typescript的ReactNative环境好吧&#xff0c;一句废话不多说&#xff0c;直接开始好吧 1.全局安装create-react-native-app yarn global add create-react-native-app 2.create-react-native-app 你的项目名称 例如&#xff1a;create-r…

如何不使用Java 8默认方法

警告&#xff1a;一旦阅读&#xff0c;您将无法看不到它 我在上一篇博客文章中讨论了默认方法的多重继承&#xff0c;以及它们在编译和运行时的行为。 这周&#xff0c;我将研究如何使用默认方法进行真正的继承&#xff0c;实际上&#xff0c;默认方法并不是为这种方法而设计的…