基础算法之Dijkstra最短路径
核心思想:以起始原点为中心,想外层扩展,知道扩展到重点为止。
设到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最短路径的更多相关文章
- 【算法日记】Dijkstra最短路径算法
上一篇再说广度优先搜索的适合提到了图. 狄克斯拉特算法是在图的基础上增加了 加权图的概念.就是节点和节点之间是有不同距离的 1.算法实例 用Dijkstra算法找出以A为起点的单源最短路径步骤如下 算 ...
- 一篇文章讲透Dijkstra最短路径算法
Dijkstra是典型最短路径算法,计算一个起始节点到路径中其他所有节点的最短路径的算法和思想.在一些专业课程中如数据结构,图论,运筹学等都有介绍.其思想是一种基础的求最短路径的算法,通过基础思想的变 ...
- Python 图_系列之纵横对比 Bellman-Ford 和 Dijkstra 最短路径算法
1. 前言 因无向.无加权图的任意顶点之间的最短路径由顶点之间的边数决定,可以直接使用原始定义的广度优先搜索算法查找. 但是,无论是有向.还是无向,只要是加权图,最短路径长度的定义是:起点到终点之间所 ...
- 图中最短路径算法(Dijkstra算法)(转)
1.Dijkstra 1) 适用条件&范围: a) 单源最短路径(从源点s到其它所有顶点v); b) 有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E ...
- 最短路径算法(Dijkstra算法、Floyd-Warshall算法)
最短路径算法具体的形式包括: 确定起点的最短路径问题:即已知起始结点,求最短路径的问题.适合使用Dijkstra算法. 确定终点的最短路径问题:即已知终结结点,求最短路径的问题.在无向图中,该问题与确 ...
- Dijkstra最短路径算法[贪心]
Dijkstra算法的标记和结构与prim算法的用法十分相似.它们两者都会从余下顶点的优先队列中选择下一个顶点来构造一颗扩展树.但千万不要把它们混淆了.它们解决的是不同的问题,因此,所操作的优先级也是 ...
- SRM 583 Div II Level Three:GameOnABoard,Dijkstra最短路径算法
题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12556 用Dijkstra实现,之前用Floyd算法写了一个, ...
- Java邻接表表示加权有向图,附dijkstra最短路径算法
从A到B,有多条路线,要找出最短路线,应该用哪种数据结构来存储这些数据. 这不是显然的考查图论的相关知识了么, 1.图的两种表示方式: 邻接矩阵:二维数组搞定. 邻接表:Map<Vertext, ...
- 最小生成树(prime算法 & kruskal算法)和 最短路径算法(floyd算法 & dijkstra算法)
一.主要内容: 介绍图论中两大经典问题:最小生成树问题以及最短路径问题,以及给出解决每个问题的两种不同算法. 其中最小生成树问题可参考以下题目: 题目1012:畅通工程 http://ac.jobdu ...
随机推荐
- 现学现卖】IntelliJ+EmmyLua 开发调试Unity中Xlua
http://blog.csdn.net/u010019717/article/details/77510066?ref=myread http://blog.csdn.NET/u010019717 ...
- 移动端或APP禁止放大标识
如果手机端或者APP的应用里面,有点击一下屏幕会自己放大,解决办法如下: 在头部添加一条meta标识 <meta name="viewport" content=" ...
- Java入门系列-08-选择结构
这篇文章为你搞懂2个问题 if-else选择结构的使用? switch 的使用? 前面我们学习的代码都是直上直下的执行,还不会"拐弯",这篇文章带大家来看一下会"拐弯&q ...
- nyoj 983 ——首尾相连数组的最大子数组和——————【最大子串和变形】
首尾相连数组的最大子数组和 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首 ...
- 常用shell脚本(持续更新中)
1. 写一个shell脚本来得到当前的日期,时间,用户名和当前工作目录. 答案 : 输出用户名,当前日期和时间,以及当前工作目录的命令就是logname,date,who i am和pwd. #!/b ...
- linux环境下 mysql数据库忘记密码 处理办法
整个修改过程大概3-10分钟(看个人操作),这个时间内mysql出于不需要密码就能登陆的状态,请设法保证系统安全 不罗嗦直接上步骤 1.vi /etc/my.cnf 在[mysqld]下,添加一句:s ...
- jsp九大内置对象==欣欣
内置对象特点: 1. 由JSP规范提供,不用编写者实例化. 2. 通过Web容器实现和管理 3. 所有JSP页面均可使用 4. ...
- CSS如何设置换行文字自动对齐
CSS如何设置换行文字自动对齐 如图所示: 代码实现如下: <ul class='warn-page-content'> <li> ...
- android 调试卡在:Waiting for Debugger - Application XXX is waiting for the debugger to Attach" 解决方法
解决方法:重启adb. 步骤:cmd进入命令行,进入adb所在目录先后执行adb kill-server,adb start-server.
- Js 对象数组,转化为字符串
var str = [{"cuid":"23910","content":"是","type":&q ...