核心思想:以起始原点为中心,想外层扩展,知道扩展到重点为止。

设到A点的最短路径上,A点前驱节点为B,则该路径包含到达节点B的最短路径。

S集合代表已经探索过的节点,U集合表示未探索过的节点。

时间复杂度为O(n^2)

具体过程见下图和表

C++代码如下:

 #include<stdio.h>
#define MAXDIS 4294967295
using namespace std; class MatrixGraphic{
public:
MatrxiGraphic(int number=){
this->vertexNum = number;
vertex = new int[vertexNum];
arc = new int *[vertexNum];
for(int i=;i<vertexNum;i++)
{
arc[i]=new int[vertex];
for(int j=;j<vertexNum;j++)
{
arc[i][j] = MAXDIS;
}
}
} int getValueOfEdge(int start,int end)
{
return arc[start][end];j
}
int getVertexNumber()
{
return vertexNum;
} void setValueOfEdge(int start,int end,int value)
{
this->arc[start][end] = value;
}
private:
int vertexNum;
int *vertex;
int **arc;
} void dijkstra(MatrixGraphic *graphic,int s,int *dist,int *prev)
{
int vertexNUm = graphic->getVertexNumber();
bool *S = new bool[vertexNum];
for(int i=;i<vertexNum;i++)
{
dist[i]=graphic->getValueOfEdge(s,i);
S[i]=false;
if(dist[i]==MAXDIS)
{
prev[i]=-;
}
else
{
prev[i]=s;
}
} dist[s]=;
S[s] = true; for(int i=;i<vertexNum;i++)
{
int temp = MAXDIS;
int u=s;
for(int j=;j<vertexNum;j++)
{
if(!S[j] && dist[j]<temp)
{
u=j;
temp = dist[j];
}
}
S[u]=true;
for(int j=;j<vertexNum;j++)
{
int edge = graphic->getValueOfEdge(u,j);
if(!S[i] && edge<MAXDIS)
{
int newDist = dist[u]+edge;
if(newDist<dist[j])
{
dist[j]=newDist;
prev[j]=u;
}
}
}
} for(int i=;i<vertexNum;i++)
{
int *stack = new int[vertexNum];
int top = ;
stack[top]=i;
top++;
int tempVertex = prev[i];
while(tempVertex != s)
{
stack[top]=tempVertex;
top++;
tempVertex = prev[tempVertex];
}
stack[top] = s;
for(int j=top;j>=;j--)
{
if(j!=)
{
cout<<stack[top]<<"->";
}
else
{
cout<<stack[top]<<endl;
}
}
}
}

基础算法之Dijkstra最短路径的更多相关文章

  1. 【算法日记】Dijkstra最短路径算法

    上一篇再说广度优先搜索的适合提到了图. 狄克斯拉特算法是在图的基础上增加了 加权图的概念.就是节点和节点之间是有不同距离的 1.算法实例 用Dijkstra算法找出以A为起点的单源最短路径步骤如下 算 ...

  2. 一篇文章讲透Dijkstra最短路径算法

    Dijkstra是典型最短路径算法,计算一个起始节点到路径中其他所有节点的最短路径的算法和思想.在一些专业课程中如数据结构,图论,运筹学等都有介绍.其思想是一种基础的求最短路径的算法,通过基础思想的变 ...

  3. Python 图_系列之纵横对比 Bellman-Ford 和 Dijkstra 最短路径算法

    1. 前言 因无向.无加权图的任意顶点之间的最短路径由顶点之间的边数决定,可以直接使用原始定义的广度优先搜索算法查找. 但是,无论是有向.还是无向,只要是加权图,最短路径长度的定义是:起点到终点之间所 ...

  4. 图中最短路径算法(Dijkstra算法)(转)

    1.Dijkstra 1)      适用条件&范围: a)   单源最短路径(从源点s到其它所有顶点v); b)   有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E ...

  5. 最短路径算法(Dijkstra算法、Floyd-Warshall算法)

    最短路径算法具体的形式包括: 确定起点的最短路径问题:即已知起始结点,求最短路径的问题.适合使用Dijkstra算法. 确定终点的最短路径问题:即已知终结结点,求最短路径的问题.在无向图中,该问题与确 ...

  6. Dijkstra最短路径算法[贪心]

    Dijkstra算法的标记和结构与prim算法的用法十分相似.它们两者都会从余下顶点的优先队列中选择下一个顶点来构造一颗扩展树.但千万不要把它们混淆了.它们解决的是不同的问题,因此,所操作的优先级也是 ...

  7. SRM 583 Div II Level Three:GameOnABoard,Dijkstra最短路径算法

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12556 用Dijkstra实现,之前用Floyd算法写了一个, ...

  8. Java邻接表表示加权有向图,附dijkstra最短路径算法

    从A到B,有多条路线,要找出最短路线,应该用哪种数据结构来存储这些数据. 这不是显然的考查图论的相关知识了么, 1.图的两种表示方式: 邻接矩阵:二维数组搞定. 邻接表:Map<Vertext, ...

  9. 最小生成树(prime算法 & kruskal算法)和 最短路径算法(floyd算法 & dijkstra算法)

    一.主要内容: 介绍图论中两大经典问题:最小生成树问题以及最短路径问题,以及给出解决每个问题的两种不同算法. 其中最小生成树问题可参考以下题目: 题目1012:畅通工程 http://ac.jobdu ...

随机推荐

  1. Ubuntu系统里如何正确卸载oracle-j2sdk1.6(图文详解)

    问题来源 因为,我在安装clouder manager5.X的时候,默认是需要oracle-j2sdk1.7. 它4.X时,才是1.6的. 若你还是在用clouder manager4.X版本的话,需 ...

  2. maven pom.xml指定jdk

    <plugins> <!-- 指定jdk --> <plugin> <groupId>org.apache.maven.plugins</grou ...

  3. 你还在把Java当成Android官方开发语言吗?Kotlin了解一下!

    导语:2017年Google IO大会宣布使用Kotlin作为Android的官方开发语言,相比较与典型的面相对象的JAVA语言,Kotlin作为一种新式的函数式编程语言,也有人称之为Android平 ...

  4. XML深入了解(XML JavaSprint)

    XMLHttpRequest 对象 XMLHttpRequest 对象用于在后台与服务器交换数据. XMLHttpRequest 对象是开发者的梦想,因为您能够: 在不重新加载页面的情况下更新网页 在 ...

  5. jQuery基础——选择器、效果

    一.使用JS的痛处 在学习和使用js的过程中发现了js的一些痛处: 1.书写繁琐,代码量大. 2.代码复杂. 3.动画效果很难实现.使用定时器,要小心各种定时器的清除.各种操作和处理事件不好实现. 4 ...

  6. String StringBuffer StringBuilder对比

    1.相同点 三者都可以用来存储字符串类型数据. 2.不同点 String类型对象内容不可变,每变化一次都会创建一个新的对象. StringBuiler与StringBuffer的内容与长度均可以发生变 ...

  7. 设备信息工具pv-jd快速上手

    pv-jd 这是一个判断设备信息的小工具,可以判断出移动端还是PC端,提供了多种API 快速开始 安装npm install pv-jd -S 示例 import {judgeDevice, judg ...

  8. 3、HTML属性

    属性的意义是为HTML提供附加信息. 属性中,名称和值总是成对出现.比如 <img src="1" width="2" /> src="1 ...

  9. 22_AOP_切面——静态切面

    [Spring AOP 如何定位连接点] 1.增强提供了连接点的方位信息:如织入到方法前面.后面等. 2.切点描述的是织入到哪些类的哪些方法上. [切点] Spring通过org.springfram ...

  10. CentOS安装chrome-浏览器

    首先,在CentOS中安装软件,通过yum命令来安装软件,就要在系统中的软件源中添加软件源节点,即在目录./etc/yum.repos.d/下的CentOS-Base.repo文件中做修改:在控制台C ...