dijkstra算法解决单源最短路问题
简介
最近这段时间刚好做了最短路问题的算法报告,因此对dijkstra算法也有了更深的理解,下面和大家分享一下我的学习过程。
前言
呃呃呃,听起来也没那么难,其实,真的没那么难,只要弄清楚思路就很容易了。下面正经的跟大家说下解决问题的过程。
实现过程
我们先用一个d[i]数组表示起点到点i的直接距离,然后从d[i]数组中找最小的值所对应的点,然后看点与点i之间相连的点j,
然后比较d[j]和d[i]+w[i][j](w[i][j]表示的是点i到点j之间的距离)之间的大小,然后把d[j]和d[i]+w[i][j之间较小的一个赋值给
d[j],即d[j]=min(d[j],d[i]+w[i][j])。并把点i标记已访问。
然后我们不断的进行上面的操作,直到把所有的点全部访问完毕。
下面是操作过程的流程图
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
解决问题
题目大概意思:“比如说,在一张无向图中,给了结点数和边的数目让你求出起点到其他各点的最短距离。”
输入数据为:
下面是具体实现的代码:
/*dijkstra算法*/
#include<iostream>
const long long maxint = ;
using namespace std;
const int maxn = ;
int n, m;
int a, b, v, w[maxn][maxn];
int dis[maxn]; //记录起点到别的结点之间的距离
bool s[maxn]; //标记这个点是否在图中
//v0=1;
void dijkstra(int v0) {
dis[] = ;
dis[v0] = ;
s[v0] = true;
for (int i = ; i <= n; ++i) { //将每个点到起点的距离更新一下
dis[i] = w[v0][i];
s[i] = false;
}
while () {
int min = maxint;
int u = -; //标志变量
for (int j = ; j <= n; ++j) {
if ((!s[j]) && dis[j] < min) { //找出不在图里面且权值最小的点
u = j; //将这个点记录下来
min = dis[j];
}
}
if (u == -) break;
s[u] = true; //将这个点放入图中
for (int j = ; j <= n; ++j) {
if ((!s[j]) && dis[u] + w[u][j] < dis[j]) {
dis[j] = dis[u] + w[u][j]; //松弛操作 更新起点到这个点的距离
}
}
}
}
int main() {
cout << "请输入结点数目和点数: ";
while (cin >> n >> m && n&&m) { //输入点的数目和边的数目
for (int i = ; i <= n; ++i) {
for (int j = ; j <= n; ++j) {
w[i][j] = maxint; //先将每条边的距离弄成很大,后面如果两条边的权值不等于这个很大的数,则说明两个数之间有边
}
}
cout << "请输入两点之间的距离" << endl;
for (int i = ; i < m; ++i) {
cin >> a >> b >> v;
w[a][b] = v; //因为无向图
w[b][a] = v; //所以两个都赋值
}
dijkstra();
for (int i = ; i <= n; ++i) {
if(w[][i]!=maxint)
cout << "起点1到点" << i << "的最短距离是" << dis[i] << endl;
else cout << "起点1到点" << i << "没有路径"<< endl;
}
// cout << dis[n] << endl;
}
}
程序运行的结果就是这样的。。。。。。。
好了,到此为止,朴素版本的dijkstra算法就讲完了,感觉好low啊【嘤嘤嘤】
那个那个,估计下一篇博客会把堆优化版本的dijkstra算法更新一下,然后,,,下一次更新不知道是啥时候了,哈哈!
dijkstra算法解决单源最短路问题的更多相关文章
- Dijkstra算法解决单源最短路径
单源最短路径问题:给定一个带权有向图 G = (V, E), 其中每条边的权是一个实数.另外,还给定 V 中的一个顶点,称为源.现在要计算从源到其他所有各顶点的最短路径长度.这里的长度是指路上各边权之 ...
- Bellman-Ford算法解决单源最短路问题
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #define max 100 #define I ...
- [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)
Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...
- Dijkstra算法详细(单源最短路径算法)
介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...
- Til the Cows Come Home(poj 2387 Dijkstra算法(单源最短路径))
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 32824 Accepted: 11098 Description Bes ...
- 【转】Dijkstra算法(单源最短路径)
原文:http://www.cnblogs.com/dolphin0520/archive/2011/08/26/2155202.html 单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路 ...
- 【算法】Dijkstra算法(单源最短路径问题)(路径还原) 邻接矩阵和邻接表实现
Dijkstra算法可使用的前提:不存在负圈. 负圈:负圈又称负环,就是说一个全部由负权的边组成的环,这样的话不存在最短路,因为每在环中转一圈路径总长就会边小. 算法描述: 1.找到最短距离已确定的顶 ...
- Dijkstra算法求单源最短路径
Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店 ...
- Floyd算法解决多源最短路问题
说好的写dijkstra 算法堆优化版本的,但是因为,妹子需要,我还是先把Floyd算法写一下吧!啦啦啦! 咳咳,还是说正事吧! ----------------------------------- ...
随机推荐
- 无向图 解决Unity地图上固定网络上,标记走固定步数能到达的位置
首先需要了解无向图的定义 参考:https://www.cnblogs.com/wxgblogs/p/5572391.html 我们选择链表的方式进行操作. int StartPositon; int ...
- 对于JavaBean+Servlet+SqlServer的代码总结和打包调用
日期:2019.3.24 博客期:049 星期日 说起来我已经说过很多次前台的应用技术了呢!这一次我是要将这一部分打包,做成配套的制作工具: 当前我已经打包成功,想要下载的同学可以进入我的GitHub ...
- input输入框只能输入正整数、字母、小数、汉字
只需将需要的代码加入到input输入框中,即可使用! 1,文本框只能输入数字代码(小数点也不能输入) 代码如下: <input onkeyup="this.value=this.val ...
- [转] iOS11.3 fastclick.js相关bug
最近遇到奇异的bug,在ios 11.3移动端页面 input输入框第一次触摸可以弹起键盘,后续再触摸需要很难弹起键盘,或者需要在输入框停一会才能弹起键盘. bug复现条件: 一.ios 11.3中a ...
- shell 处理小数位加减法(比较)运算
有一个shell脚本需要处理小数位运算,刚开始使用了expr Java代码 a=7.9 b=10 c=`expr $a \> $b` 结果运算错误,因为expr只支持整数运算,不支持小数. ...
- 1.XGBOOST算法推导
最近因为实习的缘故,所以开始复习各种算法推导~~~就先拿这个xgboost练练手吧. (参考原作者ppt 链接:https://pan.baidu.com/s/1MN2eR-4BMY-jA5SIm6W ...
- 输出第n个丑数
方法一:暴力法 代码如下: 判断是否是丑数 public static boolean isUgly(int n){ while(n!=1){ if(n%2 == 0){ n /= 2; }else ...
- 20175305张天钰《java程序设计》第五周学习总结
<java程序设计>第五周学习总结 接口与实现 知识小点: (1)用Arrays.sort方法对所有实现Comparable接口的对象进行排序 (2)接口体现了has-a关系,继承体现了i ...
- 20165319 Exp1 PC平台逆向破解
本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShell,会返 ...
- 极速创建 IOS APP !涛舅舅苹果 IOS APP自助生成系统!不用证书、不用越狱、永久可用
不用签名将网页封装成苹果APP,无需苹果企业签名,IPA签名,ios签名,免越狱安装 (本方法只支持网站封装app,原生的用不了,详细请咨询客服) 近期很多朋友问我把网站变成app的方法,原因很多种, ...