最短路径算法之二——Dijkstra算法

Dijkstra算法

  Dijkstra算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

  注意该算法要求图中不存在负权边。

  首先我们来定义一个二维数组Edge[MAXN][MAXN]来存储图的信息。

    这个图的Edge数组初始化以后为

    我们还需要用一个一维数组dis来存储1号顶点到其余各个顶点的初始路程,如下。

  这个dis数组中存的是最短路的估计值。

  通过Dijkstra算法来松弛后,dis存的为从初始点到各点的精确值(最短路径)了。

Dijkstra算法实现如下(以HDU1548为例):

 1 #include<stdio.h>
 2 #include<limits.h>
 3 #include<iostream>
 4 #include<string.h>
 5 #define MAXN 200
 6 using namespace std;
 7 int edge[MAXN+10][MAXN+10];
 8 int dis[MAXN+10];
 9 bool vis[MAXN+10];
10 int T,S,D,N,k;
11 void dijkstra(int begin)
12 {
13     memset(vis,0,sizeof(vis));
14     for (int i=1; i<=T; i++)
15         dis[i]=INT_MAX;
16     dis[begin]=0;
17     for (int t=1; t<=T; t++)
18     {
19         vis[begin]=1;
20         for (int i=1; i<=T; i++)
21             if (!vis[i]&&edge[begin][i]!=INT_MAX&&dis[begin]+edge[begin][i]<dis[i])
22                 dis[i]=dis[begin]+edge[begin][i];
23         int min=INT_MAX;
24         for (int j=1; j<=T; j++)
25             if (!vis[j]&&min>dis[j])
26             {
27                 min=dis[j];
28                 begin=j;
29             }
30     }
31 }
32 int main()
33 {
34     int begin,end;
35     while (cin>>T)
36     {
37         if (T==0) break;
38         for (int i=1; i<=MAXN; i++)
39             for (int j=1; j<=MAXN; j++)
40                 edge[i][j]=INT_MAX;
41         scanf("%d %d",&begin,&end);
42         int t;
43         for (int i=1; i<=T; i++)
44         {
45             scanf("%d",&t);
46             if (i+t<=T) edge[i][i+t]=1;
47             if (i-t>=1) edge[i][i-t]=1;
48         }
49         dijkstra(begin);
50         if (dis[end]!=INT_MAX) printf("%d\n",dis[end]);
51         else printf("-1\n");
52     }
53     return 0;
54 }

时间复杂度:O(N^2)

使用邻接表(见下文)优化后可达到O(MlogN)

PS:M在最坏情况下可能为N^2!!

部分图片文字摘自于啊哈磊的blog。

最短路径算法之二——Dijkstra算法

时间: 2024-11-05 20:30:30

最短路径算法之二——Dijkstra算法的相关文章

【最短路】求两点间最短路径的改进的Dijkstra算法及其matlab实现

代码来源:<图论算法及其matlab实现>(北京航空航天出版社) P18 书中提出了基于经典Dijkstra算法改进的两种算法. 其中算法Ⅱ的效率较高. 代码如下: 1 function a=Dijk(a) 2 %a(输入量)表示图的邻接矩阵 3 %a(输出量)表示所求最短路径的距离矩阵 4 5 %建立邻接矩阵,若不还是对称矩阵,则变为对称矩阵 6 n=length(a); 7 for i=2:n 8 for j=1:(i-1) 9 a(i,j)=a(j,i); 10 end 11 end 1

六度分离(floyd算法,SPFA算法,最短路—Dijkstra算法)

Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 36   Accepted Submission(s) : 16 Problem Description 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为"小世界现象(small world phenomenon)"的著名假说.大意是说.不论什么2个素不相识的人中间最多

《程序设计与算法(二)算法基础》《第五周 分治》求排列的逆序数 11

011:求排列的逆序数 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信息的兴趣,从而实现个性化的服务. 对于不同的排名结果可以用逆序来评价它们之间的差异.考虑1,2,…,n的排列i1,i2,…,in,如果其中存在j,k,满足 j < k 且 ij > ik, 那么就称(ij,ik)是这个排列的一个逆序. 一个排列含有逆序的个数称为这个排

《程序设计与算法(二)算法基础》课程算法Python重写

因为自己目前在中国大学MOOC学习北京大学郭炜老师的算法课,为了督促自己能更好的理解算法的思想,避免自己偷懒,所以把老师上课说讲的算法都用Python来实现一遍,以监督自己能努力认真的完成该门课程. 可能算法更新较慢,但是我还是会努力完成老师上课所讲授的算法,加油!如果后续算法有实现不对的地方,请各位博友批评指正,谢谢各位! 原文地址:https://www.cnblogs.com/an-wl/p/12238795.html

程序设计与算法(二)算法基础》《第一周 枚举》熄灯问题 POJ-1222

https://www.cnblogs.com/huashanqingzhu/p/7278930.html http://bailian.openjudge.cn/practice/12221222:EXTENDED LIGHTS OUT 这道题我花了比较多的时间才想清楚,比较难想的地方在第一行的枚举,假设第一行6个元素是 0 1 0 1 0 1, 一盏灯只有亮和灭两个状态,每盏灯只有两个操作,按下开关与不按开关,我之前以为枚举的是0~63,即0000 0000 ~1111 1111, 这种想法

程序设计与算法(二)算法基础》《第二周 递归》N皇后问题

https://www.cnblogs.com/franknihao/p/9416145.html 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子. 在一个棋盘上如果要放八个皇后,使得她们互相之间不能攻击(即任意两两之间都不同行不同列不同斜线),求出一种(进一步的,所有)布局方式. /* Recurse N Queens problem */ #include<iostream> #include&

程序设计与算法(二)算法基础》《第五周 二分》分治

/* MergeSort 归并排序 复杂度: n*log(n) */ #include<iostream> using namespace std; void MergeSort(int a[], int s, int e, int tmp[]); void Merge(int a[], int s, int m, int e, int tmp[]); int a[10] = { 13,27,19,2,8,12,2,8,30,89 }; int b[10]; int main() { int

《程序设计与算法(二)算法基础》《第六周 分治》动态规划

1163:The Triangle 查看 提交 统计 提示 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 73 88 1 02 7 4 44 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that starts at the top and ends some

(转)图算法单源最短路径Dijkstra算法(邻接表/邻接矩阵+优先队列STL)

一.前言 最短路径算法,顾名思义就是求解某点到某点的最短的距离.消耗.费用等等,有各种各样的描述,在地图上看,可以说是图上一个地点到达另外一个地点的最短的距离.比方说,我们把地图上的每一个城市想象成一个点,从一个城市到另一个城市的花费是不一样的.现在我们要从上海去往北京,需要考虑的是找到一条路线,使得从上海到北京的花费最小.有人可能首先会想到,飞机直达啊,这当然是时间消耗最小的方法,但是考虑到费用的高昂,这条线路甚至还不如上海到北京的高铁可取.更有甚者,假设国家开通了从上海到西藏,再从西藏到兰州