最短路径问题-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算法 加权图中,我们很可能关心这样一个问题:从一个顶点到另一个顶点成本最小的路径.比如从成都到北京,途中还有好多城市,如何规划路线,能使总路程最小:或者我们 ...
随机推荐
- 并发编程之socketserver模块
一.socketserver模块介绍 基于tcp套接字,关键的就是两个循环,一个是链接循环,一个是通信循环 socketserver模块中分两大类:srever类(解决链接问题)和request类(解 ...
- Spring Boot(一):初步认识
简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置 ...
- 创建者模式Builder
创建者模式: 分离对象子组件的单独构造(由Builder来负责)和装配(由Director负责),对象的构造比较复杂时使用 该模式. 类图: Builder 抽象建造者接口,规范各个组成部分的构建. ...
- verilog 条件编译命令`ifdef、`else、`endif 的应用
[摘自夏宇闻<verilog设计教程>]一般情况下,Verilog HDL源程序中所有的行都将参加编译.但是有时希望对其中的一部分内容只有在满足条件才进行编译,也就是对一部分内容指定编译的 ...
- Linux Awk使用案例总结(nginx日志统计,文件对比合并等)
知识点: 1)数组 数组是用来存储一系列值的变量,可通过索引来访问数组的值. Awk中数组称为关联数组,因为它的下标(索引)可以是数字也可以是字符串. 下标通常称为键,数组元素的键和值存储在Awk程序 ...
- C#compiler
http://www.cnblogs.com/Ninputer/archive/2011/06/12/2078671.html Compilers - Managed Profile-Guided O ...
- 使用filter导致服务器返回的页面始终是空白---在doFilter中漏写了chain.doFilter()
今天调代码的时候,突然发现,服务器开着,什么都没有问题,当我把下面这个filter给deploy了以后,访问所有的页面就都是空白. 后来发现,是因为在代码路径中,有一条路径没有调用filterChai ...
- 锁与theadLocal的合并使用
); , TimeUnit.); ){ , TimeUnit.); ){ ); infoPO.setRemainAmount(infoPO.getRemainAmount()-amount); bas ...
- JS中onclick事件传参
美术馆案例中,需要将“增加一个img标签,放入大图片”这样一个函数封装,但是在调用的时候需要传参. <script type="text/javascript"> on ...
- Java调用存储过程小结
学生在学习jdbc的时候,会问到怎么调用存储过程,现在将java调用oracle存储过程的示例总结如下.(关于调用sqlserver的存储过程将在下次进行小结请关注) 一:无返回值的存储过程 存储过程 ...