博客转载自:https://blog.csdn.net/crescent__moon/article/details/16986765

先说说Dijkstra吧,这种算法只能求单源最短路径,那么什么是单源最短路径呢?就是只能求一个点到别的点最短路径,而不能求所有点到其它点的最短路径。当然如果枚举所有点都用一遍Dijkstra的话,也能求出来,不过这就失去了这个算法的真正意义,而且时间复杂度会从O(n^2)变为O(n^3)。这个算法还有一个缺点就是在图中权值必须都是正的,否则不能用。下面说说Dijkstra的实现,首先你得有一个要求的源点和终点,然后有图,如果图之间没有直接连边,则初始化它们的权值为inf,如果两点相同,则权值为0,当然这是用邻接矩阵存的图,确保存的边是最短的。然后你得有两个数组来维护,一个是vis数组,用来判断节点是否被访问过,另一个是dis数组,用来存储其余点到源点的最短路径。初始化时,将vis数组全部设为false,dis数组为图中源点到各个点的距离,如果没有直接路径,则为inf。好了,初始化结束了,要开始实现了,要确保每个点都被访问过,所以除了源点之外,还有n-1个点,所以要遍历这n-1个点。每一次从这些点中找出vis是false的,也就是没有被访问过的,而且从这些中在找出到源点最近的那个点,设为v,然后标记v的vis为true,然后以这个v点开始,遍历与p点相邻的点,并且这些相邻的的点还要确保都没有访问过(vis为false)。然后这个算法关键之处就到来了,对这些与v相邻的顶点设为w,依次判读dis[v]的值+c(v,w)(代表v到w的直接可达的路径)是否小于dis[w],如果小于,则更新dis[w]的值。至此为止,就是Dijksta算法。

以这个图为例来演示一遍这个算法的实现:以a为源点,求a到其它点的最短路径。

然后找与adist最近的,即c点,然后以c点开始遍历与其相邻的节点e和f,并更新它们的dist和路径。

c点vis标记为true了,然后找vis标记为false的且dist最小的,也就是f点,遍历与f点相邻的邻接点且vis为false,也就是g和d点。

所以f点也访问完了,vis标记为true,然后接下来找的点,大家也能一眼看出是找e点了,然后遍历g点。

接下来访问d点。

在访问g点。

最后访问b点。

这就是此算法的实现。伪代码是:

void dijkstra(int u)//u为源点
{
for(int i=1; i<=n; i++)
{
dist[i]=map[u][i];
vis[i]=0;
}
dist[u]=0;
vis[u]=1;
for(int i=2; i<=n; i++)
{
int pos=0,min=inf;
for(j=1; j<=n; j++)
if(!vis[j]&&dist[j]<min)
{
pos=j;
min=dist[j];
}
vis[pos]=1;
for(j=1; j<=n; j++)
{
if(!vis[j]&&dis[j]>dis[pos]+map[pos][j])
{
dis[j]=dis[pos]+map[pos][j]
pre[j]=pos;//记录其前驱
}
}
}
}

Floyd算法求的是所有点之间的最短路径,并且可以处理权值为负值的边,时间复杂度为O(n^3)。

定义Dk,i,j为从vi到vj只使用v1,v2,…,vk作为中间顶点的最短路径的权。根据这个定义,D0,i,j=ci,j,其中若(vi,vj)不是该图的边,则ci,j=∞。并且,根据定义,D|v|,i,j是图中从vi到vj的最短路径。Floyd算法的基本思想是动态规划,1、求出顶点Vi和Vj不经过任何顶点的最短路径,路径的长度就是二者之间边的权重,表示为:P(0,i,j)=C(i,j)。

2、当求出P(k-1,i,j) 后,即Vi到Vj经过V1到Vk-1中的某些顶点的最短路径。则:Vi到Vj的中间经过V1到Vk中某些顶点的最短路径P(k,i,j)。

图的表示为:

下面以一个例子来说明它的实现:这是初始时的情况

当k=0时,

当k=1时:

当k=2时:

至此为止,此算法就结束了,图中的值即为任意两点间的最短距离。

Floyd的伪代码是:

for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(map[i][k]+map[k][j]<map[i][j])
map[i][j]=map[i][k]+map[k][j];
}

  

最短路径Dijkstar算法和Floyd算法详解(c语言版)的更多相关文章

  1. 最短路径——Dijkstra算法和Floyd算法

    Dijkstra算法概述 Dijkstra算法是由荷兰计算机科学家狄克斯特拉(Dijkstra)于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图(无 ...

  2. 最短路径Dijkstra算法和Floyd算法整理、

    转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径—Dijkstra算法和Floyd算法 Dijks ...

  3. 【转】最短路径——Dijkstra算法和Floyd算法

    [转]最短路径--Dijkstra算法和Floyd算法 标签(空格分隔): 算法 本文是转载,原文在:最短路径-Dijkstra算法和Floyd算法 注意:以下代码 只是描述思路,没有测试过!! Di ...

  4. 最短路径—Dijkstra算法和Floyd算法

    原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最后边附有我根据文中Dijkstra算法的描述使用jav ...

  5. 最短路径—Dijkstra算法和Floyd算法【转】

    本文来自博客园的文章:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算法 1.定义概览 Dijk ...

  6. 图的最短路径——dijkstra算法和Floyd算法

    dijkstra算法 求某一顶点到其它各个顶点的最短路径:已知某一顶点v0,求它顶点到其它顶点的最短路径,该算法按照最短路径递增的顺序产生一点到其余各顶点的所有最短路径. 对于图G={V,{E}};将 ...

  7. 【转载】最短路径—Dijkstra算法和Floyd算法

    注意:以下代码 只是描述思路,没有测试过!! Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始 ...

  8. 最短路径—Dijkstra 算法和Floyd 算法

    某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在 ...

  9. 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?

    简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以 ...

随机推荐

  1. 通过例子深入理解javascript中的new操作符

    1.首先看一道题目 function Cat(name,age){ this.name=name; this.age=age; } console.log(new Cat('miaomiao',18) ...

  2. 【VS外接程序】利用T4模板生成模块代码

    引言 记得第一次做asp.net mvc项目时,可以用model直接生成Html的增删改查页面, 没什么特殊要求都可以不用修改直接用了, 觉得很神奇,效率太高了.后来在做客户端开发时,发现很多模块都是 ...

  3. Busybox shell脚本修改密码

    /****************************************************************************** * Busybox shell脚本修改密 ...

  4. Docker 容器相关技术

    Docker 依赖的Linux内核特性 Namespaces 命名空间 Control groups (cgroups) 控制组 理解这两个特性,能够更好的帮助我们理解docker的资源分配和管理 N ...

  5. unity 联机调试(android ios)

    http://blog.csdn.net/OnafioO/article/details/44903491 (这种没用,只是在手机看到画面而已) 手机安装unityRemote并运行,unity中设置 ...

  6. Python函数-cmp()

    cmp(x, y) 作用:         比较两个对象x和y,如果x < y ,返回负数:x == y, 返回0:x > y,返回正数. 注:在python2所有版本中都可用,但在pyt ...

  7. 树结构ztree的 ajax交互的简单使用

    今天做前端页面要用到树结构,用了第三方插件ztree,搞了好久不过终于弄出来了,, 一点小心得.(用的版本 V3 ) 首先看下载的文件结构: 一:将要用到的CSS 和 JS 拷贝到工程中,我这里在工程 ...

  8. $timeout()定时器

    非常不幸的一点是,人们似乎常常将AngularJS中的$timeOut()函数看做是一个内置的.无须在意的函数.但是,如果你忘记了$timeOut()的回调函数将会造成非常不好的影响,你可能会因此遇到 ...

  9. postgresql 数据库,模式,表空间的关系

    数据库与模式模式(schema)是对数据库(database)逻辑分割在数据库创建的同时,就已经默认为数据库创建了一个模式--public,这也是该数据库的默认模式.所有为此数据库创建的对象(表.函数 ...

  10. Cassandra 学习三 安装

    1: 下载Cassandra 2  解压 3   设置环境变量  4 修改cassandra里的conf目录下配置文件            配置文件地址是   D:\cassandra\apache ...