2.图论经典算法之最短路~FLOYD

这大概是图论最基础的算法之一吧,本篇主要介绍佛洛依德(floyd)求图中任意两点之间的最短距离




弗洛伊德(Floyd)

采用邻接矩阵存图,n*n的矩阵存储点到点的最短距离

这里首先介绍一下动态规划(dp)的思想,给出三个点v1 v2 v3,你已经知道v1到v2的最短距离为1,v2到v3的嘴短距离为2,v1通过v2再到v3的最短距离显然为1+2,而在你存贮中的v1到v3却有可能比3长,有可能比3短,也可能就是3,如果比3长,显然需要更新这个数据,没错,Floyd就是不断的利用中间点来更新起点和终点之间的最短距离,最后达到求出任意两点的最短路长度的算法,他也是本篇介绍的算法中唯一一个不是求单源最短路径的算法(单源最短路径只能求出给定一点到其他点的最短路,而无法得知任意两点之间的最短路,看不懂不要紧,看到后面会明白的)

上图,图中是我们建完图所得到的初始n*n数组,这里要额外讲一个小技巧,在我们没有开始输入边的信息的时候,所有的点都是不相连的,所以,这个时候应该初始化矩阵内全为无限大,当然我们下意识的就想到遍历一遍都给他一个超大的值来表示不能到达,没错,介绍一个好用的函数,memset,使用之前要包括头文件


#include<string.h>

memset(mem,0x3f,sizeof(mem))

这个函数其实是对字节进行操作,第一个参数是地址,这里也就是mem数组的名字,0x3f其实就是63,众所周知一个字节有8比特,0x3f其实就是01111111,其实就是把这个字节变成011111111,这样得到的int或者long类型就会是一个很大的数,不赘述,不懂的自己搜索引擎,sizeof(mem)就是mem数组所占长度,这个参数的意思就是对给定位置(第一个参数)后面的第三参数的长度的字节进行初始化!另外需要提醒的是,此函数虽然方便,但是速度较慢,如果卡常,建议手写初始化。

主要算法,其实就是个三层循环,第一层k枚举的是中转点,第二层i枚举起点,第三层j枚举终点,只要以k为中转点可以更新i到j的距离,那就更新,时间复杂度n的三次方,比较暴力,一般不常用,但是还是要理解动态规划的思想!(引用我认为讲的最好的一段话:最开始只允许经过1号顶点进行中转,接下来只允许经过1和2号顶点进行中转……允许经过1~n号所有顶点进行中转,求任意两点之间的最短路程。用一句话概括就是:从i号顶点到j号顶点只经过前k号点的最短路程。)思考一下如果先枚举起点,再枚举中间点会出什么问题嘻嘻。
for(k=1;k<=n;k++) 

 for(i=1;i<=n;i++) 

for(j=1;j<=n;j++) 

 if(e[i][j]>e[i][k]+e[k][j]) 

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


初始


只准许用1号点中转


1和2都可以被中转


1和2和3都可以被中转

更新完毕

是不是很简单啊,如果还没明白自己画一个图模拟一遍就懂啦(图源网络)!

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

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,340评论 0 2
  • Floyd 算法 简介 Floyd 算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径...
    廖少少阅读 8,462评论 0 1
  • [编程题]比较重量小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量。这些钻石的重量各不相同。在他们...
    骇客与画家阅读 813评论 0 0
  • 求图的最短路径(详谈Floyd和Dijkstra) (注:在这一部分起点、源点意思相近;点的距离、边的长度、权值意...
    _黑色吊椅阅读 2,769评论 0 9
  • 今天我上午我的三号本丢了。我有三节语文课,第二节语文课丢了我三号本。我把作业本拿走了郝老师判作业,然后到第三节老师...
    小欣乐阅读 152评论 0 0