概述

与前面说的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的更多相关文章

  1. 最短路径算法Dijkstra和A*

    在设计基于地图的游戏,特别是isometric斜45度视角游戏时,几乎必须要用到最短路径算法.Dijkstra算法是寻找当前最优路径(距离原点最近),如果遇到更短的路径,则修改路径(边松弛). Ast ...

  2. 最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson

    根据DSqiu的blog整理出来 :http://dsqiu.iteye.com/blog/1689163 PS:模板是自己写的,如有错误欢迎指出~ 本文内容框架: §1 Dijkstra算法 §2 ...

  3. 单源最短路径(dijkstra算法)php实现

    做一个医学项目,当中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路例如以下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么( ...

  4. 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)

    一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...

  5. 最短路径之Dijkstra算法和Floyd-Warshall算法

    最短路径算法 最短路径算法通常用在寻找图中任意两个结点之间的最短路径或者是求全局最短路径,像是包括Dijkstra.A*.Bellman-Ford.SPFA(Bellman-Ford的改进版本).Fl ...

  6. 【算法设计与分析基础】25、单起点最短路径的dijkstra算法

    首先看看这换个数据图 邻接矩阵 dijkstra算法的寻找最短路径的核心就是对于这个节点的数据结构的设计 1.节点中保存有已经加入最短路径的集合中到当前节点的最短路径的节点 2.从起点经过或者不经过 ...

  7. POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你 ...

  8. 最短路径问题---Dijkstra算法详解

    侵删https://blog.csdn.net/qq_35644234/article/details/60870719 前言 Nobody can go back and start a new b ...

  9. 数据结构与算法--最短路径之Dijkstra算法

    数据结构与算法--最短路径之Dijkstra算法 加权图中,我们很可能关心这样一个问题:从一个顶点到另一个顶点成本最小的路径.比如从成都到北京,途中还有好多城市,如何规划路线,能使总路程最小:或者我们 ...

随机推荐

  1. 怎么使用 bat 使用日期时间重命名文件名

    d: rename A.txt "A%date:~0,4%-%date:~5,2%-%date:~8,2%_%time:~0,2%-%time:~3,2%-%time:~6,2%_backu ...

  2. .NET Remoting中的通道注册

    今天我的同事使用Remoting注册一个新通道.奇怪的是,通道始终无法注册,总是报告异常“该通道已被占用”.我明白这个异常出现的原因,但不明白的是此时系统并未使用任何一个通道,为何会有这个异常呢?即使 ...

  3. css3实现立方体效果

    <!DOCTYPE html><html><head><meta charset="utf-8" /><title>&l ...

  4. centos7添加服务

    [Unit] Description=rockae Service After=network.target [Service] ExecStart=/bin/java -jar /usr/local ...

  5. JAVA-JSP动作元素之forward

    相关资料:<21天学通Java Web开发> 结果总结:1.用来转移用户的请求,使得用户请求的页面从一个页面跳转到另一个页面.2.跳转为服务器端跳转,所以用户的地址栏不会发生任何变化.3. ...

  6. c# 操作Word总结【转】

    http://www.cnblogs.com/eye-like/p/4121219.html 在医疗管理系统中为保存患者的体检和治疗记录,方便以后的医生或其他人查看.当把数据保存到数据库中,需要新建很 ...

  7. vs2010程序运行出错 link : fatal error lnk1123: 转换到 coff 期间失败: 文件无效或损坏

    vs2010程序运行出错 link : fatal error lnk1123: 转换到 coff 期间失败: 文件无效或损坏 2014-03-27 11:34杜_柏 | 浏览 36144 次 请问这 ...

  8. 使用嵌入文档Here Documents

    Unix/Linux Shell编程实战:使用嵌入文档Here Documents 一.Here Documents(嵌入文档)Here Documents作为重定向的一种方式,指示shell从源文件 ...

  9. spring session实现集群中session共享

    本文转自:http://dorole.com/1422/ 使用框架的会话管理工具,也就是本文要说的spring-session,可以理解是替换了Servlet那一套会话管理,既不依赖容器,又不需要改动 ...

  10. 【WPF/WAF】界面布局(View)文件的多层嵌套(Nest)

    碎碎念:使用的是略冷门的Window Application Foundation(WAF)框架,搜到的都是WPF的UserControl用户控件的用法,实在蛋疼. 需求:主界面ShellWindow ...