基础算法之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 ...
随机推荐
- SpringBoot | 第二十九章:Dubbo的集成和使用
前言 今年年初时,阿里巴巴开源的高性能服务框架dubbo又开始了新一轮的更新,还加入了Apache孵化器.原先项目使用了spring cloud之后,已经比较少用dubbo.目前又抽调回原来的行业应用 ...
- 调用sqlserver中的存储过程
1.存储过程名 string strSQL = "usp_GetUnReturnPassports"; 2.创建数据库对象 database Database db = Datab ...
- java基础之登录程序
注:此版本仅供学习使用! Login.java import java.awt.Font; import java.awt.event.*; import java.sql.*; import jav ...
- python学习(四)--POST请求
from urllib import requestimport urllibimport re #网页版有道翻译是ajax的post请求. #浏览器请求地址http://fanyi.youdao.c ...
- java.util.regex.Pattern正则表达式写验证器示例
import java.util.regex.Pattern; /** * 校验器:利用正则表达式校验邮箱.手机号等 * */ public class Validator { /** * 正则表达式 ...
- Java基础之 学java从宝宝的命令行做起
JAVA学习笔记 JAVA命令行 在当前文件的命令行下 编译:输入命令javac GetGreeting.java 执行 命令 Java GetGreeting 有package包的程序 1.到文件当 ...
- java几种常见的排序算法总结
/*************几种常见的排序算法总结***************************/ package paixu; public class PaiXu { final int ...
- lua load
load (chunk [, chunkname [, mode [, env]]]) 加载一个代码块. 如果 chunk 是一个字符串,代码块指这个字符串. 如果 chunk 是一个函数, load ...
- H5分享到微信好友朋友圈QQ好友QQ空间微博二维码
这是分享按钮: <button onclick="call()">通用分享</button> <button onclick="call(' ...
- linux环境下 mysql数据库忘记密码 处理办法
整个修改过程大概3-10分钟(看个人操作),这个时间内mysql出于不需要密码就能登陆的状态,请设法保证系统安全 不罗嗦直接上步骤 1.vi /etc/my.cnf 在[mysqld]下,添加一句:s ...