《算法》C++代码 Floyd

今天写写最短路径的Floyd算法(有翻译叫弗洛伊德,不过这奇葩翻译用来读读就好……)。

这个算法的实质,广义来讲,其实是DP(动态规划)。其实按说,算法应该先说说什么贪心、搜索、DP、二分之类的基本算法的,但我觉得太广的东西对没有基础的人来说讲起来不清楚,还是先写写比较典型的一些算法比较好。而且这个系列是C++代码,并非过于详细的分析描述,那些以后有时间再写。

Floyd,求一个图中任意两点间的最短路径。图中有N个点,则算法复杂度是O(N³),空间复杂度是O(N²),编程复杂度极低。

先说下其中的基本操作,若i->j的当前路径不如i->k->j短,则更新最短路。这个操作叫做“松弛操作”,是最短路径算法中很基础的操作,就像排序中的“交换操作”一样基础,Floyd、Dijkstra、SPFA都是基于这个操作的。写成代码就是:

  if(d[i][j]<d[i][k]+d[k][j]) d[i][j]=d[i][k]+d[k][j];

Floyd算法的思想是,以每个点分别为中间结点(上式中的k),去更新所有路径。例如对于u->v来说,最短路径是u->k1->k2->k3->k4->v,假设k1<k3<k2<k4,那么实际过程就是:

  0、算法初始化,定义一个d数组,存的是初始任意两点间距离,若存在边u->v,则d[u][v] = u->v;若不存在边u->v,则d[u][v] = ∞(其实就相当于图的邻接矩阵,只不过没有的边补成了∞)

  1、不妨设原本d[u][v] = ∞

  2、在k=k1时,d[u][k2] = d[u][k1]+d[k1][k2] = u->k1->k2;

  3、在k=k3时,d[k2][k4] = d[k2][k3]+d[k3][k4] = k2->k3->k4;

  4、在k=k2时,d[u][k4] = d[u][k2]+d[k2][k4] = u->k1->k2->k3->k4;

  5、在k=k4时,d[u][v] = d[u][k4]+d[k4][v] = u->k1->k2->k3->k4->v;

  6、算法结束,d[u][v]中所存为最终最短路径,所有点对皆是如此,所以全部过程完结之后,任意两点的最短路径就都求出来了。

其实,这推导过程中,有些问题没有考虑到,因此算法的正确性在此文中并没有得到完整证明。时间所限,不再细说,有兴趣的同学可以想想,我有时间会再提的。

代码很简单,就三行:

for(int k=1;k<=N;++k)
    for(int i=1;i<=N;++i)
        for(int j=1;j<=N;++j) d[i][j] ← d[i][k]+d[k][j]; // 此处表示用右侧更新左侧,即松弛操作
时间: 2024-10-12 19:09:58

《算法》C++代码 Floyd的相关文章

Python实现各种排序算法的代码示例总结

Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示例总结,其实Python是非常好的算法入门学习时的配套高级语言,需要的朋友可以参考下 在Python实践中,我们往往遇到排序问题,比如在对搜索结果打分的排序(没有排序就没有Google等搜索引擎的存在),当然,这样的例子数不胜数.<数据结构>也会花大量篇幅讲解排序.之前一段时间,由于需要,我复习了

排序算法总结---代码+性能

// data_sort_alg.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "sort_alg.h" #include <iostream> #include <vector> void show(std::vector<int> &a) { std::vector<int>::iterator it=a.begin(); while(it!=a.

机器学习算法的代码实现之第四章节:回归之梯度上升法

二种类别的点在平面上分布,我想找到一条直线,将平面划为两半边,每一边的点类别尽可能的统一,如何找到效果最佳的分界线,这就是最佳拟合问题,也叫作回归问题. 这次,代码很少.logRegres.py # coding:utf-8 from numpy import * #=============================================================================== # 数据集 #=============================

计算机视觉算法与代码集锦

计算机视觉算法与代码集锦 计算机视觉是结合了传统摄影测量,现代计算机信息技术.人工智能等多学科的一个大学科,是一片开垦不足的大陆,路很远,但很多人都在跋涉! 本文转自CSDN(地址http://blog.csdn.net/whucv/article/details/7907391),是一篇很好的算法与代码总结文档,转载在此供大家学习参考. 原文如下: UIUC的Jia-Bin Huang同学收集了很多计算机视觉方面的代码,链接如下: https://netfiles.uiuc.edu/jbhua

谱聚类算法及其代码(Spectral Clustering)

简介 文章将介绍谱聚类(spectral clustering)的基本算法,以及在matlab下的代码实现.介绍内容将包括: 从图分割角度直观理解谱聚类 谱聚类算法步骤 数据以及实现代码 本文将不会涉及细节化的证明和推导,如有兴趣可参考july大神的文章从拉普拉斯矩阵说到谱聚类. 对谱聚类的理解 这一节将从图分割聚类的角度直观理解谱聚类.不过,因为本人是从事社交媒体分析的,将从一种社会关系网络的角度来介绍网络图分割成多个子图的概念. 图的分割 首先将社会关系网络看成是一个整体,每一个个体(use

php短网址算法实例代码分享

php实现的短网址算法,理论上支持1,073,741,824个短网址. 每个网址用6个字符代替,(6^32) 最多可以拥有1,073,741,824个短网址.当然,你还可以记录更详细的信息,如访问记录,创建时间等.如果真不够用了,还可以删掉很久不用的. function shorturl($input) { $base32 = array ( 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p

kmp算法c++代码实现

1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 #define max 5000 5 6 int t[max];//目标串 7 int p[max];//模式串 8 int next[max];//前缀函数 9 int n,m;//n为目标串的数目,m为模式串的数目 10 void function_prefix(int *s,int *next) 11 { 12 next[1]=next[0]=0;

各种排序算法的代码

1 // ALLKindsOfSorts.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include<iostream> 6 #include<vector> 7 #include<bitset> 8 9 using namespace std; 10 11 ////////////////////////////////////////所有的排序总结///////////////////

KMP算法的代码实现

上周算法班的BEN老师花了1个小时讲自动机和KMP的关系,结果failed...明天又要上课了,花了半天时间看了下KMP,暂且停留在利用next求模式中的跳跃长度,自动机那个还不能理解... 具体的可以百度阮一峰的KMP算法. 看着什么前缀后缀,突然想到上下文无关文法乔姆斯基范式了....又想到了NFA和正则表达式的转换,是时候复习复习了.. 太晚了,直接上代码,明天继续看ML和统计学!加油! 1 #include <iostream> 2 #include <string> 3

机器学习——简单线性回归(原理推导+算法描述+代码实现)

实验环境:Python 3.6 编辑器:Jupyter Notebook 6.0.1 实验要求:可以调用numpy.pandas基础拓展程序包,不可以调用sklearn机器学 ——————————————————我是分割线喵———————————————————— ————————————(如果想要代码可以直接下拉到最后)———————————— 线性模型的一般形式:   向量形式: 线性模型的优点: 1.形式简单.易于建模 2.可解释性 3.是非线性模型的基础,可以在线性模型的基础上引入层级结