最短路径问题-Dijkstra
概述
与前面说的Floyd算法相比,Dijkstra算法只能求得图中特定顶点到其余所有顶点的最短路径长度,即单源最短路径问题。
算法思路
1、初始化,集合K中加入顶点v,顶点v到其自身的最短距离为0,到其它所有顶点为无穷。
2、遍历与集合K中结点直接相邻的边(U,V,C),其中U属于集合K,V不属于集合K,计算由结点v出发,按照已经得到的最短路径到达U,再由U经过该边达到V时的路径长度。比较所有与集合K中结点直接相邻的非集合K结点该路径长度,其中路径长度最小的顶点被确定为下一个最短路径确定的结点,其最短路径长度即为该路径长度,最后将该结点并入集合K。
3、若集合K中已经包含了所有的点,算法结束,否则重复步骤2。
给出Dijkstra算法的代码
#include"stdafx.h"
#include <iostream> using namespace std;
const int MAXSIZE = ;
const int INF = ;//当作最大值
typedef struct VertexNode{
int Index;//点的编号默认为从1开始
char info;
}; typedef struct MGraph{
int edges[MAXSIZE][MAXSIZE];
VertexNode nodes[MAXSIZE];
int n, e;
};
//构建一个用邻接矩阵存储的图
void CreateMGraph(MGraph& g,int n,int e);
//迪杰斯特拉算法求图的最短路径
void DijkStra(MGraph& g, int v, int dist[], int path[]);
//输出该最短路径
void PrintRoad(int path[],int v); void main(void)
{
MGraph g;
int dist[MAXSIZE];
int path[MAXSIZE];
CreateMGraph(g, , );
DijkStra(g, , dist, path);
PrintRoad(path, );
} void CreateMGraph(MGraph& g, int n,int e)
{
g.n = n;
g.e = e;
int vertex1, vertex2;
int value;
for (int i = ; i <= n; ++i)
{
g.nodes[i].Index = i;
} for (int i = ; i <= g.n; ++i)
for (int j = ; j <= g.n; ++j)
{
g.edges[i][j] = INF;
} for (int j = ; j <= e; j++)
{
cout << "请输入边的两个点,中间以空格隔开\n";
cin >> vertex1 >> vertex2;
cout << "请输入该边的权值\n";
cin >> value;
g.edges[vertex1][vertex2] = value;
}
} void DijkStra(MGraph& g, int v,int dist[], int path[])
{
int i, j, min, u;
int visited[MAXSIZE];
for (i = ; i <= g.n; ++i)
{
if (g.edges[v][i] < INF)
{
dist[i] = g.edges[v][i];
path[i] = v;
}
else
{
dist[i] = -;
path[i] = -;
} visited[i] = ;
}
visited[v] = ;
for (i = ; i <= g.n; ++i)
{
min = INF;
for (j = ; j <= g.n;++j)
if (visited[j] == && dist[j] < min)
{
min = dist[j];
u = j;
}
visited[u] = ;
for (j = ; j <= g.n; ++j)
{
if (visited[j] == && dist[j] > g.edges[u][j] + dist[u])
{
dist[j] = g.edges[u][j] + dist[u];
path[j] = u;
}
}
}
} void PrintRoad(int path[],int v)
{
int stack[MAXSIZE], top = -;
while (path[v]!= -)
{
stack[++top] = v;
v = path[v];
}
stack[++top] = v;
while (top != -)
{
cout << stack[top--] << " ";
}
cout << endl;
}
最短路径问题-Dijkstra的更多相关文章
- 最短路径算法Dijkstra和A*
在设计基于地图的游戏,特别是isometric斜45度视角游戏时,几乎必须要用到最短路径算法.Dijkstra算法是寻找当前最优路径(距离原点最近),如果遇到更短的路径,则修改路径(边松弛). Ast ...
- 最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson
根据DSqiu的blog整理出来 :http://dsqiu.iteye.com/blog/1689163 PS:模板是自己写的,如有错误欢迎指出~ 本文内容框架: §1 Dijkstra算法 §2 ...
- 单源最短路径(dijkstra算法)php实现
做一个医学项目,当中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路例如以下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么( ...
- 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)
一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...
- 最短路径之Dijkstra算法和Floyd-Warshall算法
最短路径算法 最短路径算法通常用在寻找图中任意两个结点之间的最短路径或者是求全局最短路径,像是包括Dijkstra.A*.Bellman-Ford.SPFA(Bellman-Ford的改进版本).Fl ...
- 【算法设计与分析基础】25、单起点最短路径的dijkstra算法
首先看看这换个数据图 邻接矩阵 dijkstra算法的寻找最短路径的核心就是对于这个节点的数据结构的设计 1.节点中保存有已经加入最短路径的集合中到当前节点的最短路径的节点 2.从起点经过或者不经过 ...
- POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你 ...
- 最短路径问题---Dijkstra算法详解
侵删https://blog.csdn.net/qq_35644234/article/details/60870719 前言 Nobody can go back and start a new b ...
- 数据结构与算法--最短路径之Dijkstra算法
数据结构与算法--最短路径之Dijkstra算法 加权图中,我们很可能关心这样一个问题:从一个顶点到另一个顶点成本最小的路径.比如从成都到北京,途中还有好多城市,如何规划路线,能使总路程最小:或者我们 ...
随机推荐
- spine 2.1.27 Pro 叠加方式(Blending)
将spine更新到2.1.27 Pro,发现有更多的叠加方式可用了,如图: 以前则只有Normal和Additive可选. 更多的叠加方式对于用spine做特效动画还是比较有用的.不过我还没试这些叠加 ...
- 强制删除一个Windows服务
一个挂起的服务如下图所示,该服务相关的所有按钮都被禁用,包括启动.停止.暂停和恢复. 要停止这个服务,首先记住这个服务的名称,在这里是 ‘EntropySoftCFS’. 然后打开命令行窗口,运行 s ...
- Windows Store Apps 开发转载
懒得写了,就直接记录转载一下文章地址吧. 如何为应用定义全局默认字体:http://blogs.msdn.com/b/gautamdh/archive/2014/03/16/how-to-change ...
- Android: TODO 应用交互的两种实现方法(Behavior)
最近在写 TODO app,涉及到 Calendar 和 RecyclerView 的交互, 需求: 1. 往上滑动, Calendar 显示为周 2. 周显示模式下,往下滑动,显示为月 3. 列表下 ...
- 【Android】3.2 基本地图功能
分类:C#.Android: 日期:2016-02-04 3.2 示例2--基本地图功能 一.简介 1.地图 地图展示:普通地图(2D,3D).卫星图和实时交通图. 地图操作:可通过接口或手势控制来实 ...
- asp.net用三层实现多条件检索
众所周知,三层将项目分为界面层,业务逻辑层和数据訪问层(以最主要的三层为例) 相同都知道,多条件检索事实上就是依据用户选择的条件项,然后来拼sql语句 那么.既然要依据用户选择的条件项来拼sql语句, ...
- http请求头中的Content-Type属性在angular 和 node中的用法
post请求的请求体有以下两种格式: 1. 字符串: 'name=code_bunny&age=12' 这种格式的请求体,需要配置请求头 'Content-Type':'application ...
- Linux命令(27):shell 结合expect,多服务器批量分发数据
shell 结合expect 写的批量scp脚本工具 except安装:http://www.cnblogs.com/lovychen/p/6525623.html expect用于自动化地执行lin ...
- feginclient和ribbon的重试策略
//自定义重试次数// @Bean// public Retryer feignRetryer(){// Retryer retryer = new Retryer.Default(100, 1000 ...
- c++重载前置++和--
C语言中,前置和后置++,--都不能作为左值,而在c++中,前置的++和--可以作为左值,从下面的重载运算符中也可以看出,它们返回的是引用,我不知道为什么这里和c语言中不同,但c++类似的提升还有三目 ...