弗洛伊德算法_弗洛伊德算法
前面Dijkstra算法和Bellman-Ford算法解决了单源最短路径问题,但是如果需要获取图中任意两顶点的最短距离呢?我们可以使用前面两个算法我们可以遍历每个顶点得到每个顶点的单源最短距离,但是最短路径算法中提供了一种更为简单的算法帮助我们实现任意两顶点最短距离(Floyd)。
弗洛伊德算法
Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。 该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授
核心思路
使用邻接矩阵G来表示图,初始化G,将不可直达的顶点初始化为无穷大,定义k结点,遍历N个顶点->k,使用k作为任意两顶点i,j之间的中介点,
如果G[i][j]>G[i][k]+G[k][j],则执行松弛操作,这里我们就可以理解为什么叫插点法了,将每一个顶点当作中介点放入任意两顶点之间,
如果可以执行松弛操作,则进行松弛。
推导过程
V0->V1 1V0->V2 2V1->V2 -1
初始化图G,执行如下操作
第一轮:
第一步:选取V0作为中介点
第二步:插入任意两顶点之间
首先插入V0->V0之间,G[0][0]>G[0][0]+G[0][0],(0>0不满足)无需松弛,
再插入V0->V1之间,G[0][1]>G[0][0]+G[0][1],(1>0+1不满足)无需松弛,
再插入V0->V2之间,G[0][2]>G[0][0]+G[0][2],(2>0+2不满足)无需松弛。
首先插入V1->V0之间,G[1][0]>G[1][0]+G[0][0],(∞>∞+0不满足)无需松弛,
再插入V1->V1之间,G[1][1]>G[1][0]+G[0][1],(∞>∞+1不满足)无需松弛,
再插入V1->V2之间,G[1][2]>G[1][0]+G[0][2],(∞>∞+2不满足)无需松弛。
......
第二轮在选取V1作为中介点,重复上面操作(这一轮会松弛 G[0][2]>G[0][1]+G[1][2]->2>1+(-1) 满足条件,松弛)
第二轮在选取V2作为中介点,重复上面操作
最终得到最短路径
实现代码
main.cpp// Floyd Created by 陈龙// Copyright © 2019 陈龙. All rights reserved.//#include using namespace std;int N,E;int main(int argc, const char * argv[]) { //N个顶点,E条边 cin>>N>>E; int u,v,w; int G[N][N]; //初始化无穷大 for (int i=0; i>u>>v>>w; G[u][v] = w; } //动态规划找中介 for (int k=0; kG[i][k]+G[k][j]){ G[i][j]=G[i][k]+G[k][j]; } } } } //最短路径 cout<
弗洛伊德算法_弗洛伊德算法相关推荐
- 常用十大算法_回溯算法
回溯算法 回溯算法已经在前面详细的分析过了,详见猛击此处. 简单的讲: 回溯算法是一种局部暴力的枚举算法 循环中,若条件满足,进入递归,开启下一次流程,若条件不满足,就不进行递归,转而进行上一次流程. ...
- cb32a_c++_STL_算法_查找算法_(5)adjacent_find
cb32a_c++_STL_算法_查找算法_(5)adjacent_find adjacent_find(b,e),b,begin(),e,end() adjacent_find(b,e,p),p-p ...
- 接受拒绝算法_通过算法拒绝大学学位
接受拒绝算法 数据科学 (Data Science) Nina was close to tears when she accused Nick Gibb of ruining her life. N ...
- python序列模式的关联算法_关联算法
以下内容来自刘建平Pinard-博客园的学习笔记,总结如下: 1 Apriori算法原理总结 Apriori算法是常用的用于挖掘出数据关联规则的算法,它用来找出数据值中频繁出现的数据集合,找出这些集合 ...
- 编程神奇算法_分类算法的神奇介绍
编程神奇算法 由Bryan Berend | 2017年3月23日 (by Bryan Berend | March 23, 2017) About Bryan: Bryan is the Lead ...
- 数据挖掘算法_数据挖掘算法入门
有南方的朋友讲过北方人喜欢打比方,尤其是甲方的,其实也没什么不好了.如果是做菜的话,那么这些算法就相当于烹饪的工具了.对原始的食材进行预处理.加工整合,选择合适烹饪工具,以及对应的方法步骤,最后收获舌 ...
- prim算法_贪心算法详解(附例题)
贪心算法的特征规律 贪心算法,"贪心"二字顾名思义,因此其规律特征就是更加注重当前的状态,贪心法做出的选择是对于当前所处状态的最优选择,它的解决问题的视角是微观的"局部& ...
- 回溯算法和贪心算法_回溯算法介绍
回溯算法和贪心算法 回溯算法 (Backtracking Algorithms) Backtracking is a general algorithm for finding all (or som ...
- 蛮力写算法_蛮力算法解释
蛮力写算法 Brute Force Algorithms are exactly what they sound like – straightforward methods of solving a ...
- 层次聚类算法 算法_聚类算法简介
层次聚类算法 算法 Take a look at the image below. It's a collection of bugs and creepy-crawlies of different ...
最新文章
- Go 学习笔记(6)— 变量定义、变量声明、变量作用域
- 4.0以后的新布局方式GridLayout
- a=10a=0C语言,C语言基础练习题(含答案)
- 转【微信小程序 四】二维码生成/扫描二维码
- 一文读懂浏览器存储与缓存机制
- 如何编程两个android 手机进行通信_100+ 队伍激烈角逐 Geek Online 2020 编程挑战赛完美收官 - 业界动态...
- JDK1.8 中文文档下载与在线阅读
- Intra Chroma Prediction
- 十大热门的 JavaScript 框架和库
- ClassLoader类加载器简介
- 工程测量学学习 详细
- 智遥工作流调用SAP基础数据,解决方案
- 运维之眼——流量采集网络
- HTTP代理IP的三种使用方法
- C语言练习:该存多少钱
- 前端路线--H5篇(day04)
- 测试面试题——三角形
- uniapp微信小程序的各种弹框提示(轻提示)
- 全鲸董事长韩耀宁受邀出席第十九届中国科学家论坛,发表重要演讲
- 记与舍友摩擦的一两事儿
热门文章
- 数据库事务的介绍和使用
- Solr集群系统架构
- MySQL的空值查询
- MySQL设置表的字段值自动增加
- android fragment contextmenu,在 fragment 中,无法为listView项创建 contextMenu_android_开发99编程知识库...
- integer比较_每日一题:Integer、int 的区别
- 阿里技术专家推荐的20本书,免费送!
- 百度 71个炸天的开源项目,你知道几个?
- eclipse快捷键 包括查找类、方法、变量
- 【JavaSE_第一周】练习题总结