概述

与前面说的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. unity, 查看内置shader源码

    1,建一个球体. 2,建一个材质,将材质拖到球体上. 3,在材质的shader下拉列表中选择想查看的内置shader,点材质栏右上设置按钮->Select Shader 进入shader面板. ...

  2. linux yum源安装

    #1.安装remi源mkdir /disk1/toolscd /disk1/toolsrpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-relea ...

  3. springmvc+spring+mybatis+maven项目构建

    1.首先在myeclipse10中安装maven的插件,将插件放入D:\Program Files (x86)\myEclipse10\MyEclipse Blue Edition 10\dropin ...

  4. linux c:关联变量的双for循环

    举例说明: 比如打印一个倒三角形. * * * * * * * * * * 第一层循环为行数,第二层循环为每行打印的*数,且随着行数的变化,打印的*数也随着改变. 这就是关联变量的双层循环.我的做法是 ...

  5. Vert.x中EventBus中的使用

    注意:使用的是vert.x3.0 仅支持到java8当中有一些lambda表达式.如不明确请自补java8新特性. The Event Bus event bus 是vert.x的神经系统. 每个ve ...

  6. 委托事件和jquery中的delegate方法

    利用事件冒泡的特性,给父元素绑定事件,然后判断事件对象,来给父元素的每个子元素添加事件,而不是直接在所有的子元素上绑定事件: <ul> <li></li> < ...

  7. c#读excel 不用office组件

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

  8. 在开发中写一些tool来提升自己的效率

    比如说,我在调试一个web-project的时候,因为eclipse默认编译好的.class文件放在/build/classes/中,但是我希望随时把这些class文件放到/WEB-ROOT/WEB- ...

  9. Linux模块的加载和卸载

    Linux操作系统中模块操作相关命令解释lsmod  查看已经安装好的模块, 也可以查看/proc/modules文件的内容. 实际上,lsmod读命令就是通过查看/proc/modules的内容来显 ...

  10. Android开发日记(二)

    HashMap<String, Object> map;定义一个HashMap用来传递字符 TextView textView_JobTitle=(TextView)findViewByI ...