最短路径-----迪杰斯特拉算法(C语言版)
原文:http://blog.csdn.net/mu399/article/details/50903876
转两张思路图非常好:
描述略 图片思路很清晰。 Dijkstra不适用负权值,负权值用 FLoyd算法。
贴上 严蔚敏版代码
- /*
- 测试数据 教科书 P189 G6 的邻接矩阵 其中 数字 1000000 代表无穷大
- 6
- 1000000 1000000 10 100000 30 100
- 1000000 1000000 5 1000000 1000000 1000000
- 1000000 1000000 1000000 50 1000000 1000000
- 1000000 1000000 1000000 1000000 1000000 10
- 1000000 1000000 1000000 20 1000000 60
- 1000000 1000000 1000000 1000000 1000000 1000000
- 结果:
- D[0] D[1] D[2] D[3] D[4] D[5]
- 0 1000000 10 50 30 60
- */
- #include <iostream>
- #include <cstdio>
- #define MAX 1000000
- using namespace std;
- int arcs[][];//邻接矩阵
- int D[];//保存最短路径长度
- int p[][];//路径
- int final[];//若final[i] = 1则说明 顶点vi已在集合S中
- int n = ;//顶点个数
- int v0 = ;//源点
- int v,w;
- void ShortestPath_DIJ()
- {
- for (v = ; v < n; v++) //循环 初始化
- {
- final[v] = ; D[v] = arcs[v0][v];
- for (w = ; w < n; w++) p[v][w] = ;//设空路径
- if (D[v] < MAX) {p[v][v0] = ; p[v][v] = ;}
- }
- D[v0] = ; final[v0]=; //初始化 v0顶点属于集合S
- //开始主循环 每次求得v0到某个顶点v的最短路径 并加v到集合S中
- for (int i = ; i < n; i++)
- {
- int min = MAX;
- for (w = ; w < n; w++)
- {
- //我认为的核心过程--选点
- if (!final[w]) //如果w顶点在V-S中
- {
- //这个过程最终选出的点 应该是选出当前V-S中与S有关联边
- //且权值最小的顶点 书上描述为 当前离V0最近的点
- if (D[w] < min) {v = w; min = D[w];}
- }
- }
- final[v] = ; //选出该点后加入到合集S中
- for (w = ; w < n; w++)//更新当前最短路径和距离
- {
- /*在此循环中 v为当前刚选入集合S中的点
- 则以点V为中间点 考察 d0v+dvw 是否小于 D[w] 如果小于 则更新
- 比如加进点 3 则若要考察 D[5] 是否要更新 就 判断 d(v0-v3) + d(v3-v5) 的和是否小于D[5]
- */
- if (!final[w] && (min+arcs[v][w]<D[w]))
- {
- D[w] = min + arcs[v][w];
- // p[w] = p[v];
- p[w][w] = ; //p[w] = p[v] + [w]
- }
- }
- }
- }
- int main()
- {
- cin >> n;
- for (int i = ; i < n; i++)
- {
- for (int j = ; j < n; j++)
- {
- cin >> arcs[i][j];
- }
- }
- ShortestPath_DIJ();
- for (int i = ; i < n; i++) printf("D[%d] = %d\n",i,D[i]);
- return ;
- }
最短路径-----迪杰斯特拉算法(C语言版)的更多相关文章
- 数据结构图之三(最短路径--迪杰斯特拉算法——转载自i=i++
数据结构图之三(最短路径--迪杰斯特拉算法) [1]最短路径 最短路径?别乱想哈,其实就是字面意思,一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两 ...
- 迪杰斯特拉算法c语言实现
/*http://1wangxiaobo@163.com 数据结构C语言版 迪杰斯特拉算法 P189 http://1wangxiaobo@163.com 编译环境:Dev-C++ 4.9.9.2 ...
- 图->最短路径->单源最短路径(迪杰斯特拉算法Dijkstra)
文字描述 引言:如下图一个交通系统,从A城到B城,有些旅客可能关心途中中转次数最少的路线,有些旅客更关心的是节省交通费用,而对于司机,里程和速度则是更感兴趣的信息.上面这些问题,都可以转化为求图中,两 ...
- 单源最短路径-迪杰斯特拉算法(Dijkstra's algorithm)
Dijkstra's algorithm 迪杰斯特拉算法是目前已知的解决单源最短路径问题的最快算法. 单源(single source)最短路径,就是从一个源点出发,考察它到任意顶点所经过的边的权重之 ...
- [从今天开始修炼数据结构]图的最短路径 —— 迪杰斯特拉算法和弗洛伊德算法的详解与Java实现
在网图和非网图中,最短路径的含义不同.非网图中边上没有权值,所谓的最短路径,其实就是两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,我们称路径上第 ...
- 图的最短路径---迪杰斯特拉(Dijkstra)算法浅析
什么是最短路径 在网图和非网图中,最短路径的含义是不一样的.对于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径. 对于网图,最短路径就是指两顶点之间经过的边上权值之和最 ...
- 算法与数据结构(六) 迪杰斯特拉算法的最短路径(Swift版)
上篇博客我们详细的介绍了两种经典的最小生成树的算法,本篇博客我们就来详细的讲一下最短路径的经典算法----迪杰斯特拉算法.首先我们先聊一下什么是最短路径,这个还是比较好理解的.比如我要从北京到济南,而 ...
- 最短路径之迪杰斯特拉算法的Java实现
Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知识准备 ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
随机推荐
- 使用正则表达式来截取nginx中的内置变量
nginx 中的内置变量都可以通过 if 指令 + 正则表达式来进行截取,截取之后的结果通过正则表达式的分组来进行引用 比如:从请求中传过来的一个名为 ssl_client_s_dn 的变量,它的值是 ...
- Amazon ec2 改成密码登录方式
sudo passwd rootsu rootvi /etc/ssh/sshd_config"# PasswordAuthentication yes" uncommentsbin ...
- CentOS 安装PostregSQL9.2 同时出现pg安装错误
错误: Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension. /usr/local/bin ...
- 利用 bugly 分析应用崩溃
Bugly-Crash监控能让我们及时的掌控应用的Crash,并快速修复.这种情况就在于我们把应用发布出去了,但是用户那边有着各种各样我们想象不到的系统崩溃,我们无法通过简单的控制台捕获错误信息和崩溃 ...
- XTU 1267 - Highway - [树的直径][2017湘潭邀请赛H题(江苏省赛)]
这道题可能有毒……总之一会儿能过一会儿不能过的,搞的我很心烦…… 依然是上次2017江苏省赛的题目,之前期末考试结束了之后有想补一下这道题,当时比较懵逼不知道怎么做……看了题解也不是很懂……就只好放弃 ...
- IDEA2016.3搭建Struts2+Hibernate+Spring项目环境
IDEA搭建SSH环境 1.环境 软件版本:IntelliJ IDEA 2016.3.2 系统:windows 7 32位 / ubuntu 框架:Hibernate3,Spring3.2, Stru ...
- Python:fromkeys()方法
简介 Python 字典(Dictionary) fromkeys() 函数用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值. 语法 fromkeys()方法语法: ...
- 自动布局又出问题-HPPGCTableViewCell
[self.firstComment mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(sel ...
- AOP与JAVA动态代理
1.AOP的各种实现 AOP就是面向切面编程,我们可以从以下几个层面来实现AOP 在编译期修改源代码 在运行期字节码加载前修改字节码 在运行期字节码加载后动态创建代理类的字节码 2.AOP各种实现机制 ...
- dedecms网站迁移时记得将安装目录放空 附迁移的正确方法
这段时间在赶一些新项目,我们建站一般都在本地服务器搭建起来,测试得差不多了才传到网上,这样对蜘蛛也相对友好一些,要不然改来改去变化太大给搜索引擎的第一印象很不好.但是由于本地环境和服务器环境还是有一些 ...