最短路径算法之二——Dijkstra算法
Dijkstra算法
Dijkstra算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
注意该算法要求图中不存在负权边。
首先我们来定义一个二维数组Edge[MAXN][MAXN]来存储图的信息。

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

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

这个dis数组中存的是最短路的估计值。
通过Dijkstra算法来松弛后,dis存的为从初始点到各点的精确值(最短路径)了。
Dijkstra算法实现如下(以HDU1548为例):
#include<stdio.h>
#include<limits.h>
#include<iostream>
#include<string.h>
#define MAXN 200
using namespace std;
int edge[MAXN+][MAXN+];
int dis[MAXN+];
bool vis[MAXN+];
int T,S,D,N,k;
void dijkstra(int begin)
{
memset(vis,,sizeof(vis));
for (int i=; i<=T; i++)
dis[i]=INT_MAX;
dis[begin]=;
for (int t=; t<=T; t++)
{
vis[begin]=;
for (int i=; i<=T; i++)
if (!vis[i]&&edge[begin][i]!=INT_MAX&&dis[begin]+edge[begin][i]<dis[i])
dis[i]=dis[begin]+edge[begin][i];
int min=INT_MAX;
for (int j=; j<=T; j++)
if (!vis[j]&&min>dis[j])
{
min=dis[j];
begin=j;
}
}
}
int main()
{
int begin,end;
while (cin>>T)
{
if (T==) break;
for (int i=; i<=MAXN; i++)
for (int j=; j<=MAXN; j++)
edge[i][j]=INT_MAX;
scanf("%d %d",&begin,&end);
int t;
for (int i=; i<=T; i++)
{
scanf("%d",&t);
if (i+t<=T) edge[i][i+t]=;
if (i-t>=) edge[i][i-t]=;
}
dijkstra(begin);
if (dis[end]!=INT_MAX) printf("%d\n",dis[end]);
else printf("-1\n");
}
return ;
}
时间复杂度:O(N^2)
使用邻接表(见下文)优化后可达到O(MlogN)
PS:M在最坏情况下可能为N^2!!
部分图片文字摘自于啊哈磊的blog。
最短路径算法之二——Dijkstra算法的更多相关文章
- 算法起步之Dijkstra算法
原文:算法起步之Dijkstra算法 友情提示:转载请注明出处[作者 idlear 博客:http://blog.csdn.net/idlear/article/details/19687579 ...
- 数据结构(C#):图的最短路径问题、(Dijkstra算法)
今天曾洋老师教了有关于图的最短路径问题,现在对例子进行一个自己的理解和整理: 题目: 要求:变成计算出给出结点V1到结点V8的最短路径 答: 首先呢,我会先通过图先把从V1到V8的各种路径全部计算下来 ...
- 最短路径 - 迪杰斯特拉(Dijkstra)算法
对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...
- 图的最短路径---迪杰斯特拉(Dijkstra)算法浅析
什么是最短路径 在网图和非网图中,最短路径的含义是不一样的.对于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径. 对于网图,最短路径就是指两顶点之间经过的边上权值之和最 ...
- 最短路径-迪杰斯特拉(dijkstra)算法及优化详解
简介: dijkstra算法解决图论中源点到任意一点的最短路径. 算法思想: 算法特点: dijkstra算法解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算 ...
- 最短路径问题---Floyed(弗洛伊德算法),dijkstra算法,SPFA算法
在NOIP比赛中,如果出图论题最短路径应该是个常考点. 求解最短路径常用的算法有:Floyed算法(O(n^3)的暴力算法,在比赛中大概能过三十分) dijkstra算法 (堆优化之后是O(MlogE ...
- 三角网格上的寻路算法Part.1—Dijkstra算法
背景 最近在研究中产生了这样的需求:在三角网格(Mesh)表示的地形图上给出两个点,求得这两个点之间的地面距离,这条距离又叫做"测地线距离(Geodesic)".计算三角网格模型表 ...
- 【Python排序搜索基本算法】之Dijkstra算法
Dijkstra算法和前一篇的Prim算法非常像,区别就在于Dijkstra算法向最短路径树(SPT)中添加顶点的时候,是按照ta与源点的距离顺序进行的.OSPF动态路由协议就是用的Dijkstra算 ...
- 算法笔记_068:Dijkstra算法简单介绍(Java)
目录 1 问题描述 2 解决方案 2.1 使用Dijkstra算法得到最短距离示例 2.2 具体编码 1 问题描述 何为Dijkstra算法? Dijkstra算法功能:给出加权连通图中一个顶点, ...
随机推荐
- (POJ 3694) Network 求桥个数
题目链接:http://poj.org/problem?id=3694Description A network administrator manages a large network. The ...
- [转载]mysql慢日志文件分析处理
原文地址:mysql慢日志文件分析处理作者:maxyicha mysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在mysq ...
- 用C语言实现统计一个文件夹中各种文件的比例
<UNIX环境高级编程>中的程序清单4-7就介绍了如何实现递归地统计某个目录下面的文件!我刚开始看过它的代码后,觉得照着敲太没意思了,所以就合上书自己写了一遍!为此还写了一篇博文,这是博文 ...
- 开发问题记录——AE开发提示80040111错误
System.runtime.interpServices.ComException(0X80040111): 80040111 ClassFactory无法供应请求的类(异常来自HRESULT:0X ...
- laravel扩展图片处理Intervention Image
github地址:https://github.com/Intervention/image
- 正则表达式模块re
正则表达式通过特定的式子匹配某种类型的字符串.对字符串进行匹配验证或者从大量的字符串里提取出特定的信息. 正则表达式包含普通字符和特殊字符.大部分的普通字符如‘A’或‘0’可以简单的来匹配自己.如te ...
- 【WS-Federation】到底有多少公司在用WS-Federation
到底有多少公司在用WS-Federation? sso先调用一个登录接口 获取一个token 然后再调用各种业务接口 如果是ssl token 直接暴露就行了 没有ssl 最好每次取一个token, ...
- TOPAPI 消息通知机制
接收用户订阅消息 public class UserSubMain { public static void main(String[] args ) throws ApiException { St ...
- iOS9下修改回HTTP模式进行网络请求
升级为iOS9后,默认请求类型为https,如何使用http进行请求会报错 The resource could not be loaded because the App Transport Sec ...
- 高动态范围光照(High Dynamic Range Imaging,简称HDRI或HDR)
1 HDR基本概念 高动态范围光照(High Dynamic Range Imaging,简称HDRI或HDR),是一种表达超过了显示器所能表现的亮度范围的图像映射技术,已成为目前游戏应用不可或缺的 ...