Dijkstra算法C++实现总结
问题描述
求无负权图中点s到点t的最短凝聚力
备注
标准说法中,“缩短”/“松弛”(relax)操作是对边进行的。下面为了行文方便,将其拓展到点。即以下操作,其中A表示目前已经算出的点i到j的距离:
A[i][j]=min(A[i][v] + A[v][j] , A[i][j]) (同时维护path数组)
算法思路
类似于按拓扑排序的顺序,对所有点进行缩短操作。
下面具体阐述。
用d[i]记录已算出的点s到点j之间的距离,path[j]记录目前算出的s到j最短路径中,j节点的上一个节点
将点分为两个集合:已完成的Known和未完成的unknown.
初始时,将所有d赋为无穷大,d[s]赋为0;所有点均为unknown
循环:对unknown的所有点,择其d最小者,进行缩短操作,该点加入known。直到所有点都为known。
实现思路
用一个数组known,known[i]为1则表示known,为0 表示unknown
一些恼人的小问题
1.无穷大问题
假设输入的邻接矩阵中,每点与自己的权值为0,不邻接的两点权值为MAX,MAX被宏定义为一个非常大但不容易溢出的整数。
2.多维动态数组传参问题
受编译器原理的限制,C/C++将多维动态数组作为函数参数传递是非常麻烦的,比如邻接矩阵。
源码
#include<iostream>
using namespace std;
#define MAX 50000
void printPath(int path[], int n,int s,int t)
{
if (t == s)
cout << s;
else
{
printPath(path, n, s, path[t]);
cout << "->"<<t;
}
}
/*
仅适用于无负权的图
distance是目前算出的s到某点的距离数组,path是从s到某点v的最短路径中,v的上一节点
初始化将distance全部赋为正无穷,之后从s点开始,进行缩短操作,
此后选择未进行缩短的点中distance最小者进行缩短,直至所有点都完成了缩短操作
*/
int main()
{
/*-----------------------声明与定义--------------------*/
int n =7, s = 0, t = 0, i, distS2T;
int G[7][7] =
{ 0,4,5,6,MAX,MAX,MAX,
4,0,3,MAX,1,MAX,MAX,
5,3,0,MAX,MAX,2,MAX,
6,MAX,MAX,0,2,MAX,MAX,
MAX,1,MAX,2,0,MAX,4,
MAX,MAX,2,MAX,MAX,0,3,
MAX,MAX,MAX,MAX,4,3,0
};
int *known = new int[n](), *distance = new int[n],*path = new int[n];
//如果s到某点距离已经确定了(该点已经被用于relax过了),则known为1,否则为0
//disFromS[]数组是s到各点的最短距离.
//---------------------------------赋初值-------------------------------
for (i = 0; i < n; i++)
{
distance[i] = MAX;
}
distance[s] = 0;
path[s] = s;
//------循环:选择unknown的点中dis最小的进行缩短操作,直到所有点全部为known------
while (1) //there's stil unknown vertex
{
i = 0;
while (known[i] == 1 && i<n)
i++;//find the first unknown vertex
if (i >= n) break; //if all vertices are known ,end the algorithm
int v = i;
for (; i < n; i++) //find the unknown vertex with the min distance
{
if (!known[i] && distance[v] > distance[i]) v = i;
}
//relax(minPos); modify dis and parent
for (i = 0; i < n; i++)
{
//for each unknown vertex i,
if (known[i]) continue;
if (distance[i] > distance[v] + G[v][i])
{
distance[i] = distance[v] + G[v][i];
path[i] = v;
}
}
known[v] = 1;
}
//--------------输出&释放内存----------------------
distS2T = distance[t];
cout << distS2T<<endl;
for (i = 0; i < n;i++)
cout << path[i] << " ";
cout << endl;
for (i = 0; i < n; i++)
cout << distance[i]<<" ";
cout << endl;
printPath(path, n, 0, 6);
delete[] known;
delete[] distance;
delete[] path;
while (1);
return 0;
}
Dijkstra算法C++实现总结的更多相关文章
- 求两点之间最短路径-Dijkstra算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...
- Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解
/* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...
- 关于dijkstra算法的一点理解
最近在准备ccf,各种补算法,图的算法基本差不多看了一遍.今天看的是Dijkstra算法,这个算法有点难理解,如果不深入想的话想要搞明白还是不容易的.弄了一个晚自习,先看书大致明白了原理,就根据书上的 ...
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- Dijkstra算法(二)之 C++详解
本章是迪杰斯特拉算法的C++实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnbl ...
- Dijkstra算法(一)之 C语言详解
本章介绍迪杰斯特拉算法.和以往一样,本文会先对迪杰斯特拉算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法 ...
- 最短路问题Dijkstra算法
Dijkstra算法可以解决源点到任意点的最短距离并输出最短路径 准备: 建立一个距离数组d[ n ],记录每个点到源点的距离是多少 建立一个访问数组v[ n ],记录每个点是否被访问到 建立一个祖先 ...
- dijkstra算法求最短路
艾兹格·W·迪科斯彻 (Edsger Wybe Dijkstra,1930年5月11日~2002年8月6日)荷兰人. 计算机科学家,毕业就职于荷兰Leiden大学,早年钻研物理及数学,而后转为计算学. ...
- 数据结构之Dijkstra算法
基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求 ...
- ACM: HDU 1869 六度分离-Dijkstra算法
HDU 1869六度分离 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descri ...
随机推荐
- java启动参数二
非标准参数又称为扩展参数,其列表如下: -Xint 设置jvm以解释模式运行,所有的字节码将被直接执行,而不会编译成本地码. -Xbatch 关闭后台代码编译,强制在前台编译,编译完成之后才能进行代码 ...
- 图论/位运算 Codeforces Round #285 (Div. 2) C. Misha and Forest
题目传送门 /* 题意:给出无向无环图,每一个点的度数和相邻点的异或和(a^b^c^....) 图论/位运算:其实这题很简单.类似拓扑排序,先把度数为1的先入对,每一次少一个度数 关键在于更新异或和, ...
- PHP获取今天内的时间 今天开始和结束的时间戳
$t = time(); $start = mktime(0,0,0,date("m",$t),date("d",$t),date("Y", ...
- openssh安装、设置指定端口号、免密码登录、变量传递、防暴力破解
首先确保机器挂在好光盘镜像,然后查看软件包信息 [root@xuegod63 ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev ...
- 给定一个整数 n,返回 n! 结果尾数中零的数量。
示例 1: 输入: 3 输出: 0 解释: 3! = 6, 尾数中没有零. 示例 2: 输入: 5 输出: 1 解释: 5! = 120, 尾数中有 1 个零. 代码部分 class Solution ...
- [转]Walkthrough: Your First F# Program
本文转自:http://msdn.microsoft.com/en-us/library/vstudio/dd233160(v=vs.100).aspx Visual Studio 2010 in ...
- 自学 iOS - 三十天三十个 Swift 项目 第三天
做了这个小demo 之后 感觉OC 和swift 还是有很大的差别的 自己还是要去多看些swift的语法 用的不是很熟练 1.这个demo 的资源文件 我都是用原工程的 2.同样的自定义cell 的 ...
- 浅谈2015新版 U-Boot
过了挺长一断时间没有看U-BOOT了,这两天下载了新版的UBOOT源码(之前看的一些书都是基于早好多年的源码来讲述,总感觉心里有点不对劲,也许是我比较喜新的原因吧,不过小弟我并没有厌旧哈),好了不多扯 ...
- 迅为iTOP-4412物联网开发板入门学习高手进阶项目开发超树莓派
免费视频教程: 为初学者精心录制的整套视频教程全部免费,随IT技术发展而不断增添的视频教程仍然免费!一支有经验的工程师团队会始终成为您的后盾. 项目实战---全开源: 手机远程控制开发板 门禁系统 W ...
- 如何选安卓android|linux系统开发板,简化学习难度,缩短开发进程
平台一:iTOP-4412精英版 系统支持:Android 4.0.3系统 / Android 4.4系统 / Linux + Qt系统 / Ubuntu12.04系统 开发板特点:Cortex-A ...