概述

与前面说的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. PHP笔试题

    1.不用新变量直接交换现有两个变量的值 (1)list($a,$b)=array($b,$a); (2)a=a+b,b=a-b,a=a-b 2.PHP数字金额转大小格式,同时说明思路 function ...

  2. python搭建简易服务器实例参考

    有关python搭建简易服务器的方法. 需求分析: 省油宝用户数 已经破了6000,原有的静态报表 已经变得臃肿不堪, 每次打开都要缓上半天,甚至浏览器直接挂掉 采用python搭建一个最最简易的 w ...

  3. 正则表达式入门(c#)

    本文是对该教程的学习练习 http://www.jb51.net/tools/zhengze.html 注:正则符号转义和普通的转义一样,加反斜杠,比如[ 变成 \[ 正则表达式符号和转义符号最好用+ ...

  4. VS自定义代码段简单使用

    在下面目录找到许多自带的代码段文件: vs安装目录\VC#\Snippets\2052\Visual C# 随便复制一个作为模板,开始改 注意这一行是最终输入的代码段:<Code Languag ...

  5. 【Android】7.3 GridLayout(网格布局)

    分类:C#.Android.VS2015: 创建日期:2016-02-10 一.简介 Android 4.0(API 14)开始提供的GridLayout布局使用虚细线将布局划分为行.列和单元格,也支 ...

  6. rabbitmq 常用的一些命令

    rabbitmqctl set_user_tags admin administrator #给用户设置角色 rabbitmqctl set_permissions -p emove admin &q ...

  7. 错误 1 error LNK2019: 无法解析的外部符号 "public: __thiscall Distance::Distance(int)" (??0Distance@@QAE@H@Z),该符号在函数 _main 中被引用

    错误: 错误 1 error LNK2019: 无法解析的外部符号 "public: __thiscall Distance::Distance(int)" (??0Distanc ...

  8. tomcat的server.xml配置及context配置直接引用工程

    server.xml配置简介         下面是这个文件中的基本配置信息,更具体的配置信息见tomcat的文档         server:         port     指定一个端口,这个 ...

  9. c#读excel 不用office组件

    某日笔者写了个导入导出excel的小程序,拿给别人用时,别人说程序有问题读不了. 究其原因发现原来是using Microsoft.Office.Interop.Excel;引用出错.发现他装的off ...

  10. https编程遇到PKIX:unable to find valid certification path to requested target 的问题

    https编程遇到PKIX:unable to find valid certification path to requested target 的问题 2016-12-01 解决方案见:解决PKI ...