有向网络(带权的有向图)的最短路径Dijkstra算法
什么是最短路径?
单源最短路径(所谓单源最短路径就是只指定一个顶点,最短路径是指其他顶点和这个顶点之间的路径的权值的最小值)
什么是最短路径问题?
给定一带权图,图中每条边的权值是非负的,代表着两顶点之间的距离。指定图中的一顶点为源点,找出源点到其它顶点的最短路径和其长度的问题,即是单源最短路径问题。
什么是Dijkstra算法?
求解单源最短路径问题的常用方法是Dijkstra(迪杰斯特拉)算法。该算法使用的是贪心策略:每次都找出剩余顶点中与源点距离最近的一个顶点。
算法思想
带权图G=<V,E>,令S为已确定了最短路径顶点的集合,则可用V-S表示剩余未确定最短路径顶点的集合。假设V0是源点,则初始 S={V0}。用数组Distance表示源点V0到其余顶点的路径长度,用数组pre[i]表示最短路径序列上顶点i的前一个顶点。初始时,pre[i]都是源点的下标。接下来需重复两个步骤:
- 从当前Distance[i]找出最小的一个,记录其下标v=i,源点V0到顶点Vv的最短路径即已确定,把Vv加入S。
- 更新源点到剩余顶点的最短路径长度。更新方法是:以上一步的顶点Vv为中间点,若Distance[v]+weight(v,i)<Distance[i],则修改值:pre[i]=v;Distance[i]=Distance[v]+weight(v,i);
重复以上两个步骤,直至所有顶点的最短路径都已找到。
需要指出,Dijkstra算法求解的不仅是有向图,无向图也是可以的。下面给出一个完整的有向带权图的实例:
下面举例:
有向带权图
Dijkstra算法的求解过程(规定INF是infinity无穷大的意思。)
基于邻接矩阵存储的有向网络的Dijkstra算法的简单实现:
const int infinity = ; //定义无穷常量,用1000表示 //定义图结构,采用邻接矩阵存储形式
template <int max_size>
class Graph
{
private:
/*邻接矩阵,对于有向网络(带权的有向图)其中存放的是权值*/
adjacent[max_size][max_size];
public:
void Dijkstra(int); //Dijkstra算法,求最短路径
}; //Dijkstra算法实现(基于邻接矩阵存储的带权有向图)
void Graph::Dijkstra(int vertex)
{
//注意:下标表示结点
int count = ; //用于记录访问过的结点数目,后面用于控制循环
bool find[max_size]; //用于标记已经找到最短路径的结点
int pre[max_size]; //用于存放当前结点的前驱结点的最短路径
int distance[max_size]; //用于存放当前结点的最短路径
//初始化
for(int i=;i<max_size;i++)
pre[i] = vertex; //开始所有结点的前驱结点都是开始的vertex
for(int i=;i<max_size;i++)
distance[i] = adjacent[vertex][i]; //邻接矩阵中存放的权值就是距离
for(int i=;i<max_size;i++)
find[i] = false; //初始化所有结点都没有找到最短路径
find[vertex] = true; int v = vertex; //用来迭代顶点的变量
int d; //用来表示距离
while(count < max_size)
{
d = infinity;
for(int i=;i<max_size;i++) //找到离最初结点最短路径的一个未访问到的结点
{
if(!find[i] && distance[i]<d)
{
d = diatance[i];
v = i;
}
}
find[v] = true;
//更新剩余的结点的前驱和最短距离
for(int i=;i<max_size;i++)
{
if(!find[i])
{
/*将上面找到的最短路径的结点作为起始点,
*连到其他未访问过的结点上,
*当比从最初结点到这个结点的路径短的时候,
*就将上个结点作为前驱结点,更新一下即可*/
d = distance[v] + adjacent[v][i];
if(d < distance[i])
{
pre[i] = v;
distance[i] = d;
}
}
}
count++;
} }
参考:http://blog.csdn.net/zhangxiangdavaid/article/details/38360337
有向网络(带权的有向图)的最短路径Dijkstra算法的更多相关文章
- 网络最短路径Dijkstra算法
最近在学习算法,看到有人写过的这样一个算法,我决定摘抄过来作为我的学习笔记: <span style="font-size:18px;">/* * File: shor ...
- 带权图的最短路径算法(Dijkstra)实现
一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...
- 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法
Dijkstra算法解决了有向图G=(V,E)上带权的单源最短路径问题,但要求所有边的权值非负. Dijkstra算法是贪婪算法的一个很好的例子.设置一顶点集合S,从源点s到集合中的顶点的最终最短路径 ...
- HDU2255 奔小康赚小钱钱(二分图-最大带权匹配)
传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子 ...
- Dijkstra 算法——计算有权最短路径(边有权值)
[0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在理解 Dijkstra 的思想并用源代码加以实现: 0.2)最短路径算法的基础知识,参见 http://blog. ...
- HIT 2739 - The Chinese Postman Problem - [带权有向图上的中国邮路问题][最小费用最大流]
题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2739 Time limit : 1 sec Memory limit : 64 M A Chinese ...
- [C++]多源最短路径(带权有向图):【Floyd算法(动态规划法)】 VS n*Dijkstra算法(贪心算法)
1 Floyd算法 1.1 解决问题/提出背景 多源最短路径(带权有向图中,求每一对顶点之间的最短路径) 方案一:弗洛伊德(Floyd算法)算法 算法思想:动态规划法 时间复杂度:O(n^3) 形式上 ...
- [算法] Dijkstra算法(带权有向图 最短路径算法)
一.带权有向图 二.算法原理 1)由于我们的节点是从1-6,所以我们创建的列表或数组都是n+1的长度,index=0的部分不使用,循环范围为1-6(方便计算). 2)循环之前,我们先初始化dis数组和 ...
- 洛谷OJ P1196 银河英雄传说(带权并查集)
题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...
随机推荐
- poj 1837 天平问题(01背包变种)
题意:给你n个挂钩,m个砝码,要求砝码都用上,问有多少中方案数 题解:对于这道题目的状态,我们定义一个变量j为平衡度,当j=0的时候,表明天平平衡.定义dp[i][j]表达的含义为使用前n个砝码的时候 ...
- c#基础知识梳理(三)
上期回顾 - https://www.cnblogs.com/liu-jinxin/p/10824638.html 一.方法 一个方法是把一些相关的语句组织在一起,用来执行一个任务的语句块.每一个 C ...
- Intellij IDEA 快捷键大全【转】
IntelliJ Idea 常用快捷键列表 Ctrl+Shift + Enter,语句完成 “!”,否定完成,输入表达式时按 “!”键 Ctrl+E,最近的文件 Ctrl+Shift+E,最近更改的文 ...
- docker系列七之Dockerfile
Dockerfile 一. Dockerfile是什么 Dockerfile是docker中镜像文件的的描述文件,说的直白点就是镜像文件到底是由什么东西一步步构成的.例如我们在淘宝上买了一件商品, ...
- CSS伸缩布局
1. 伸缩布局应用: 伸缩布局应用 主轴: Flex容器的主轴用来配置Flex项目,默认是水平方向 侧轴: 与主轴垂直的轴称为侧轴,默认还是垂直方向 方向: 默认是主轴从左向右, 侧轴默认是从上到下 ...
- python3爬虫之requests库基本使用
官方文档链接(中文) https://2.python-requests.org/zh_CN/latest/ requests 基于 urllib3 ,python编写. 安装 pip insta ...
- 为什么需要 RPC 服务?
链接:https://www.jianshu.com/p/362880b635f0 在传统的开发模式中,我们通常将系统的各个服务部署在单台机器,随着服务的扩展,这种方式已经完全无法满足系统大规模的扩展 ...
- 用js刷剑指offer(二叉树的镜像)
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...
- Vue-Cli3.0 单页面如何预渲染,解决登录拦截导致无法部分路由无法预渲染问题?
vue单页面不利于seo,如何解决已有spa项目seo问题? 1.安装 cnpm install prerender-spa-plugin --save-dev 2.路由history模式 const ...
- ggplot2入门与进阶(上)
出处:http://www.cellyse.com/how_to_use_gggplot2_part1/ ggplot2包是基于Wilkinson在<Grammar of Graphics> ...