【啊哈!算法】算法7:Dijkstra最短路算法
- 将所有的顶点分为两部分:已知最短路程的顶点集合P和未知最短路径的顶点集合Q。最开始,已知最短路径的顶点集合P中只有源点一个顶点。我们这里用一个book[ i ]数组来记录哪些点在集合P中。例如对于某个顶点i,如果book[ i ]为1则表示这个顶点在集合P中,如果book[ i ]为0则表示这个顶点在集合Q中。
- 设置源点s到自己的最短路径为0即dis=0。若存在源点有能直接到达的顶点i,则把dis[ i ]设为e[s ][ i ]。同时把所有其它(源点不能直接到达的)顶点的最短路径为设为∞。
- 在集合Q的所有顶点中选择一个离源点s最近的顶点u(即dis[u ]最小)加入到集合P。并考察所有以点u为起点的边,对每一条边进行松弛操作。例如存在一条从u到v的边,那么可以通过将边u->v添加到尾部来拓展一条从s到v的路径,这条路径的长度是dis[u ]+e[u ][v ]。如果这个值比目前已知的dis[v]的值要小,我们可以用新值来替代当前dis[v ]中的值。
- 重复第3步,如果集合Q为空,算法结束。最终dis数组中的值就是源点到所有顶点的最短路径。
- #include <stdio.h>
- int main()
- {
- int e[10][10],dis[10],book[10],i,j,n,m,t1,t2,t3,u,v,min;
- int inf=99999999; //用inf(infinity的缩写)存储一个我们认为的正无穷值
- //读入n和m,n表示顶点个数,m表示边的条数
- scanf("%d %d",&n,&m);
- //初始化
- for(i=1;i<=n;i++)
- for(j=1;j<=n;j++)
- if(i==j) e[i][j]=0;
- else e[i][j]=inf;
- //读入边
- for(i=1;i<=m;i++)
- {
- scanf("%d %d %d",&t1,&t2,&t3);
- e[t1][t2]=t3;
- }
- //初始化dis数组,这里是1号顶点到其余各个顶点的初始路程
- for(i=1;i<=n;i++)
- dis[i]=e[1][i];
- //book数组初始化
- for(i=1;i<=n;i++)
- book[i]=0;
- book[1]=1;
- //Dijkstra算法核心语句
- for(i=1;i<=n-1;i++)
- {
- //找到离1号顶点最近的顶点
- min=inf;
- for(j=1;j<=n;j++)
- {
- if(book[j]==0 && dis[j]<min)
- {
- min=dis[j];
- u=j;
- }
- }
- book[u]=1;
- for(v=1;v<=n;v++)
- {
- if(e[u][v]<inf)
- {
- if(dis[v]>dis[u]+e[u][v])
- dis[v]=dis[u]+e[u][v];
- }
- }
- }
- //输出最终的结果
- for(i=1;i<=n;i++)
- printf("%d ",dis[i]);
- getchar();
- getchar();
- return 0;
- }
复制代码
- 6 9
- 1 2 1
- 1 3 12
- 2 3 9
- 2 4 3
- 3 5 5
- 4 3 4
- 4 5 13
- 4 6 15
- 5 6 4
复制代码
- 0 1 8 4 13 17
复制代码
通过上面的代码我们可以看出,这个算法的时间复杂度是O(N*2*N)即O(N2)。其中每次找到离1号顶点最近的顶点的时间复杂度是O(N),这里我们可以用“堆”(以后再说)来优化,使得这一部分的时间复杂度降低到O(logN)。另外对于边数M少于N2的稀疏图来说(我们把M远小于N2的图称为稀疏图,而M相对较大的图称为稠密图),我们可以用邻接表(这是个神马东西?不要着急,待会再仔细讲解)来代替邻接矩阵,使得整个时间复杂度优化到O(MlogN)。请注意!在最坏的情况下M就是N2,这样的话MlogN要比N2还要大。但是大多数情况下并不会有那么多边,因此MlogN要比N2小很多。
【啊哈!算法】算法7:Dijkstra最短路算法的更多相关文章
- 【坐在马桶上看算法】算法7:Dijkstra最短路算法
上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径 ...
- Dijkstra最短路算法
Dijkstra最短路算法 --转自啊哈磊[坐在马桶上看算法]算法7:Dijkstra最短路算法 上节我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最 ...
- 图论算法(二)最短路算法:Floyd算法!
最短路算法(一) 最短路算法有三种形态:Floyd算法,Shortset Path Fast Algorithm(SPFA)算法,Dijkstra算法. 我个人打算分三次把这三个算法介绍完. (毕竟写 ...
- Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)
上周我们介绍了神奇的只有五行的 Floyd 最短路算法,它可以方便的求得任意两点的最短路径,这称为"多源最短路".本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做&q ...
- 对于dijkstra最短路算法的复习
好久没有看图论了,就从最短路算法开始了. dijkstra算法的本质是贪心.只适用于不含负权的图中.因为出现负权的话,贪心会出错. 一般来说,我们用堆(优先队列)来优化,将它O(n2)的复杂度优化为O ...
- 如何在 Java 中实现 Dijkstra 最短路算法
定义 最短路问题的定义为:设 \(G=(V,E)\) 为连通图,图中各边 \((v_i,v_j)\) 有权 \(l_{ij}\) (\(l_{ij}=\infty\) 表示 \(v_i,v_j\) 间 ...
- [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)
Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...
- dijkstra 最短路算法
最朴素的做法o(V*V/2+2E)~O(V^2)#include<iostream>using namespace std;#include<vector>#include&l ...
- dijkstra最短路算法(堆优化)
这个算法不能处理负边情况,有负边,请转到Floyd算法或SPFA算法(SPFA不能处理负环,但能判断负环) SPFA(SLF优化):https://www.cnblogs.com/yifan0305/ ...
随机推荐
- linux命令英文缩写的含义(方便记忆)
命令缩写: ls:list(列出目录内容) cd:Change Directory(改变目录) su:switch user 切换用户 rpm:redhat package manager 红帽子打包 ...
- 对http协议断点续传的理解
断点续传指的是下载传输文件可以中断,之后重新下载时可以接着中断的地方开始下载,而不必从头开始下载.断点续传需要客户端和服务端都支持. 原理是客户端一块一块的请求数据,最后将下载回来的数据块拼接成完整的 ...
- MySQL Administrator的简单操作
A.创建数据库 1.运行MySQL Administrator服务器,如下图. 2.点击"Catalogs",下面出现已有的数据库,右击已有的数据库,选择“Create New S ...
- iOS 时间戳的问题
- (NSString *)timeWithTimeIntervalString:(NSString *)timeString { // 格式化时间 NSDateFormatter* formatte ...
- HDU 4329 MAP(stringstream的用法)
这个题目有点绕,但是按着他的意思写不难模拟出来.本来是一场学弟们的训练赛,我这个学长在赛场上却WA了四次都没过,三条黑线就一直在我的脑袋上挂着... 赛后开始找原因,后来发现题目看错了,1/R中的R是 ...
- jquery 1.9版本后不在支持browser 方法的解决方案
今天对jquery 进行升级,导致项目出错,原来在1.9版本之后 jquery 不支持browser 方法了. 官方建议的又不好用,所以我所jquery 原来的代码摘除来,又扩展回去. //解决jq ...
- H5页面适配所有iPhone和安卓机型的六个技巧
http://www.th7.cn/web/html-css/201605/166006.shtml http://www.th7.cn/web/html-css/201601/153127.shtm ...
- 妙用transform
往前移动 transform.Translate transform.Translate( transform.up* speed*Time.deltaTime , Space.World); 移动t ...
- iOS 的 APP 如何适应 iPhone 5s/6/6Plus 三种屏幕的尺寸?
初代iPhone 2007年,初代iPhone发布,屏幕的宽高是 320 x 480 像素.下文也是按照宽度,高度的顺序排列.这个分辨率一直到iPhone 3GS也保持不变. 那时编写iOS的App( ...
- MyEclipse修改项目名称
项目上右击鼠标–>Properties–>MyEclipse–>Web–>Content Root–>Web content-root–>改成你想要的项目名 即可 ...