基础算法之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 ...
随机推荐
- 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤
福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...
- 让C:\Users文件夹放在D盘
新安装win7 在安装Win7的过程中,要求输入用户名及密码的时候,先不如输入任何信息,按“Shift+F10”呼出DOS窗口,输入以下命令: robocopy "C:\Users" ...
- C#(Winform)的Show()和ShowDialog()方法
1. 显示窗口的两种方式: Winform中的Form,在显示窗口时,可以使用Show()和ShowDialog()两种方式 2. 非模态窗口方式(可以跟其他界面自由切换,而且不阻塞代码) Show( ...
- Scala安装及开发环境搭建
最近想学习下scala,为后面转大数据做一些沉淀. 1. 首先保证jdk已经成功安装 2. 去官网下载scala安装程序 http://www.scala-lang.org/download/all. ...
- React.js 小书 Lesson13 - 渲染列表数据
作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson13 转载请注明出处,保留原文链接和作者信息. 列表数据在前端非常常见,我们经常要处理这种类型 ...
- hrb——开锁魔法I——————【规律】
解题思路:从1到n的倒数之和. #include<stdio.h> #include<string.h> #include<algorithm> using nam ...
- 【学习笔记】JDBC数据库连接技术(Java Database Connectivity)
一.JDBC简介 Java是通过JDBC技术实现对各种数据库的访问的,JDBC是Java数据库连接技术的简称.它可以把数据持久保存,是一种持久化机制. 1.持久化 持久化就是将程序中的数据在瞬时状态和 ...
- DOM 和 BOM
DOM 和 BOM DOM: DOM= Document Object Model,文档对象模型,DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构.换句话说,这是表示和处理一个H ...
- Flask插件---flask_script与flask_migrate
import app from flask_script import Manager from flask_migrate import Migrate,MigrateCommand my_app ...
- 详细分析UserLock如何保证高校内部信息安全
俄克拉荷马城市公立学校的IT团队负责该片区接近43000个学生的网络管理工作.长期以来,学生和教师员工共享Windows网络登录为他们带来了很多难题. 由于没有并发登录的限制,也不能对网络使用情况进行 ...