Dijkstra算法——超~~详细!!
Dijkstra算法
_ ** 时隔多月,我又回来了!**_
今天下午久违的又学了会儿算法,又重新学习了一遍Dijkstra,这是第三次重新学习Dijkstra(*以前学的都忘完了>_<*).
废话先不bb,上代码。
#include<bits/stdc++.h>
using namespace std;
#define INF 9999999
#define M 1000
int d[M];
int p[M]={};
int con[M][M];
int n,line; //n点数,边数line struct node{
char name;
}w[M];
void Dijkstra(int v,int *d,int p[],int con[M][M]) //初始点v
{
int vis[M];
for(int i=;i<=n;i++) //第一步,确定与初始点v连接的点的路径
{
d[i]=con[v][i];
vis[i]=; //vis初始化
if(d[i]!=INF)
p[i]=v;
}
d[v]=; //对第一个点初始化
vis[v]=;
for(int i=;i<=n;i++) //第二布,两重循环 ,每次循环又分两步 。判断所有点
{
int a=INF,id=v;
for(int j=;j<=n;j++) //1、找出该次循环中距离最小的点, 该点可能是一条新的路径
{
if(d[j]<a && !vis[j])
{
a=d[j]; //a确定值
id=j; //id确定点的下标
}
}
vis[id]=; //已判断过 ,已经走过
for(int j=;j<=n;j++) //2、 从此时距离最短的点出发,更新与id相连的点的值,有两种情况
{
if(!vis[j] && con[id][j]<INF)
{
int newdis=d[id]+con[id][j];
if(newdis<d[j]) //根据 newdis与d[j]判断
{
d[j]=newdis;
p[j]=id;
}
}
}
}
}
int idex(char a)
{
for(int i=;i<M;i++)
if(w[i].name==a)
return i;
}
void fun(int *p,char fist,char last)
{
char x[M];
int f=idex(fist),l=idex(last);
cout<<"从"<<fist<<"到"<<last<<"的最短路径为:\n";
x[]=last;
int y=;
int t=p[l];
while(t!=f)
{
x[y++]=w[t].name;
t=p[t];
}
cout<<fist;
for(int i=y-;i>=;i--)
cout<<"->"<<x[i];
cout<<"\n";
}
int main()
{
char a,b;
int dis;
cout << "************算法6.10 迪杰斯特拉算法**************\n";
cout<<"请输入总点数,总边数:";
cin>>n>>line;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
con[i][j]=INF;
for(int i=;i<=n;i++)
{
cout<<"请输入第"<<i<<"个点:";
cin>>w[i].name;
}
for(int i=;i<=line;i++)
{
cout<<"请输入第"<<i<<"条边:";
cin>>a>>b>>dis;
int a1=idex(a),b1=idex(b);
if(dis<INF)
{
con[a1][b1]=dis;
con[b1][a1]=dis;
}
} cout << "*****无向网G创建完成!*****\n" ;
for(int i=;i<=n;i++)
d[i]=INF;
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(con[i][j]==INF)
cout<<"∞ ";
else
cout<<con[i][j]<<" ";
}
printf("\n");
}
cout<<"请输入起点和终点:";
cin>>a>>b;
Dijkstra(idex(a), d, p, con);
cout << a<<"到最后"<<b<<"的最短路径长度为: " << d[idex(b)] <<"\n";
fun(p,a,b);
return ;
}
这次学习总结了Dijkstra算法模板函数的几个主要步骤,因为这个函数没有用到递归,只
用了两个循环,因此可以分为从上到下的两步。
Dijkstra算法模板函数主要有两步:
一、
确定与初始点v连接的点的路径 ,检查所有与初始点连接的点并更新他们的d[i]值。
二、
一个二重嵌套循环,每次for循环里又分两步:
1、
找出此次循环中(d[i]中)距离值最小的,并分别用id,a记录该点对应的下标与d[i].
2、
以这个点(id)为初始点,更新所有与该点相连通的点(d数组).
重复第二步。
**以上。**
Dijkstra算法——超~~详细!!的更多相关文章
- 【优化算法】Greedy Randomized Adaptive Search算法 超详细解析,附代码实现TSP问题求解
01 概述 Greedy Randomized Adaptive Search,贪婪随机自适应搜索(GRAS),是组合优化问题中的多起点元启发式算法,在算法的每次迭代中,主要由两个阶段组成:构造(co ...
- 数据挖掘领域十大经典算法之—C4.5算法(超详细附代码)
https://blog.csdn.net/fuqiuai/article/details/79456971 相关文章: 数据挖掘领域十大经典算法之—K-Means算法(超详细附代码) ...
- Dijkstra算法详细(单源最短路径算法)
介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...
- 求两点之间最短路径-Dijkstra算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...
- 超强、超详细Redis数据库入门教程
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...
- 最短路径—Dijkstra算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...
- Til the Cows Come Home(poj 2387 Dijkstra算法(单源最短路径))
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 32824 Accepted: 11098 Description Bes ...
- Dijkstra算法(迪杰斯塔拉算法)
算法描述: Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最 ...
- 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径
自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...
随机推荐
- 指针——可能我学的还只是c++的皮毛
C. 线性链表的插入与删除 单点时限: 2.0 sec 内存限制: 256 MB 实现线性链表的插入与删除操作 只需完成给定函数的定义. NODE* insertLinklist(NODE* head ...
- 沙雕题目 来自luogu
P5316 恋恋的数学题 题目描述 现在恋恋正在处理的题目十分简单:现在有k (2≤k≤4)k \space (2\leq k\leq 4)k (2≤k≤4)个数,恋恋不知道它们分别是几,只知道它们两 ...
- Smali基础知识
Smali是用于Dalvik(Android虚拟机)的反汇编程序实现 汇编工具(将Smali代码汇编为dex文件)为smali.jar baksmali.jar则是反汇编程序 地址:https://b ...
- try catch块的秘密
最近有同事遇到问题: 她在4处手动抛运行异常,5处存在return语句,结果程序在2出现异常时没有抛出运行异常,导致事务不一致. 我们都知道,当程序出现异常时候并且在不采取任何措施的情况下,是会抛出异 ...
- Echarts——关系图(人民的名义为例,简化)源码
参考博文:https://www.cnblogs.com/emrys5/p/echart-relationship-map.html <!DOCTYPE html> <html> ...
- vue 中引入第三方js库
以 jQuery 为例 一.绝对路径直接引入,全局可用 主入口页面 index.html 中用 script 标签引入: <script src="./static/jquery-1. ...
- 黑马vue---46、vue使用过渡类名实现动画
黑马vue---46.vue使用过渡类名实现动画 一.总结 一句话总结: vue动画的过渡类名的时间点中没有设置样式的话就是默认的样式 使用 transition 元素,把 需要被动画控制的元素,包裹 ...
- 在使用vagrant访问PHP文件是报错“file not found”,好像是最新的NGINX不能识别document_root,只能改为自己的项目目录/vagrant_data
出现该错误有很多可能,有可能是root配置不对,有可能是fastcgi_param SCRIPT_FILENAME参数不对等. 而本人遇到的也是参数不对,但是是一个比较少人提及的问题,nginx版本不 ...
- sqlplus 导出一张表数据
内网只让用sql developer 这软件搓的不行,数据加载到51行就黑了,没法法用sqlplus. 打开cmd, sqlplus user/passwd@ip:port/库名set colsep ...
- android在点击EditText的时候始终不弹出软件键盘
场景描述:正常情况下,当点击EditText时,软键盘会弹出来.现在的要求是当点击EditText时,弹日期选择对话框,选择的结果显示在EditText上.若不处理,当点击EditText时,软键盘和 ...