数据结构—弗洛伊德算法

在数据结构的学习当中,图的处理是必不可少的一项,对图进行处理时,最短路径的求取具有较强的使用性和可行性,在此,我简单地对求取最短路径的算法之一——弗洛伊德算法做出简单的讲解。

弗洛伊德算法在实现的时候一个重要的特点就是用循环的嵌套来进行逐个的判断和更新。此算法区分于迪杰斯特拉算法的很大的优点就是弗洛伊德算法可以在实现过后实现了图中每一个结点的对其余各个结点的最短路径,而后者只是针对一个目标结点计算出该结点到其他结点的最短路径。但是,由于这次只是做弗洛伊德算法的讲解,对于迪杰斯特拉算法便不予赘述。

如果要求任意两个结点之间的最短路径,我们可能已经有了简单的想法,在两个结点之间存在直接的路径时,比较这个路径和经过一次结点的中转,甚至二次、三次、以及多次的中转之后的权值之和比较,最短的权值之和就可以确定该路径为最短路径;若两者没有直接路径,则需考虑在经过结点的中转以后,无论经过了几次中转结点,只要选出权值最短的路径,该路径就是最短路径。

这便是最短路径的求取方法。

这个过程看似实现较难,但加上了一些辅助变量后,便可以顺利实现。

但是要加入哪些辅助变量呢?首先需要考虑到的是path数组存放计算出的最短路径的结果。行标表示起点结点,列标表示终点结点,则该位置存放的数据则是终点结点的前一个结点。

例如:从a到达c的最短路径为:a—》b—》c;若a的下标是1;c的下标是4;b的下标是2;则path[1][4]=2;若从c到e的最短路径是c—》d—》a—》e;c,d,a,e的下标分别为3,4,1,5;

则path[3][5]=1;在查找最短路径时的顺序则是path[3][5]=1,path[3][1]=4;path[3][4]=3;路径顺序就为:下标5《--1《--4《--3。

另外,需要加入辅助数组D,该数组用于记录两结点直接的最短路径长度如D[0][3]=3;表示从0到3的最短路径长度为3;

现在,让我们回到上述自己设想的问题,如何比较两个结点之间的路径长度和呢?

在弗洛伊德算法中,采用的方法是权值的更新,以下是弗洛伊德的具体算法,以便于讲解


下面开始对代码展开讲解:

个人认为,算法的实现可以分为两部分,其中每一部分可以用以上的两个for循环来划分,第一个for循环如下,进行的是权值和路径的初始化

D[i][j]=G.arc[i][j];          //将下标为i的结点与相关的结点权值初始化,如果有直接路径,则长度是已知权值,否则的初始化结果是无穷

if (D[i][j]<Maxint)

p[i][j]=i;                       //已初始化后,有直接路径的话终点结点的前一个结点便是起点结点

else

p[i][j]=0;                      //没有直接路径,进行特殊标记。

进行了初始化之后,数组D内的元素应该与图D的权值数组G.arc相等,并且数组path内的数据也根据图中结点间的关系获得了初值。

第二部分体现为针对两个目标结点加入图中的每一个结点作为中转结点进行路径长度的判断,根据判断结果更新两个数组内容,这个算法很容易使人联想到密码破解时使用的穷举法。

代码如下:

for (i=0;i<G.vexnum;i++)

for(j=0;j<G.vexnum;j++)      //起始结点

for(k=0;k<G.vexnum;k++)    //终点结点

if (D[j][k]>D[j][i]+D[i][k])     //j,k是需要更新的两个结点,现在欲在这两个结点中加入下标为i的结点,并判断加入新的结点以后的路径长度。

{

D[j][k]=D[j][i]+D[i][k];

p[j][k]=p[k][i];                   //可以更新,则进行数据更新。

}

到此,循环结束,最短路径的查找也完成。

需要说明的是,每一次数据的更新,path数组都保存有前一个结点的信息,如图:


首先path[0][1]=0;D[0][1]=6;之后,有初始化后的结果:path[0][2]=0,D[0][2]=1,2和1之间没有路径故D[2][1]=Maxint,path[0][1],D[0][1]无需更新,之后,判断0和3,D[0][3]=Maxint是初始化的结果,更新加入2之后成了path[0][3]=2;D[0][3]=3;path[2][3]=0,D[2][3]=2,path[3][1],D[3][1]=1加入任意结点之后无需更新,故保持;再进行path[0][1],D[0][1]的判断时,尝试加入结点2,不成功,再尝试加入点3时,由于D[0][3]已经更新为3,所以满足更新条件,D[0][1]=4,path[0][1]=3完成了从0到1中间大于1个中转结点的实现。

总结在于,第二部分使用三个for语句的嵌套起到了重要的作用,数据的更新和信息的保存也需要准确理解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 图的概念 图是一种非线性的数据结构,一个图中有两类东西,一种是结点,一种是边.我们用V这个集合来表示节点(vert...
    fredal阅读 2,309评论 2 14
  • 维基百科的说法: A搜索算法,俗称A星算法*。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用...
    wangzun阅读 1,390评论 0 4
  • 贪心算法 贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上...
    fredal阅读 9,195评论 3 52
  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,149评论 0 25
  • 课程介绍 先修课:概率统计,程序设计实习,集合论与图论 后续课:算法分析与设计,编译原理,操作系统,数据库概论,人...
    ShellyWhen阅读 2,249评论 0 3