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(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...
随机推荐
- Python学习日记(十)—— 杂货铺(全局变量补充、Python参数传递、字符串格式化、迭代器、生成器)
全局变量补充 python自己添加了些全局变量 print(vars()) """结果: {'__name__': '__main__', '__doc__': None ...
- Hdu 5344
Hdu5344 题意: 给你一个数组,求所有的 $ a_i + a_j $ 的异或值. 解法: 因为 $ (a_i+a_j) \bigoplus (a_j + a_i) = 0$ . 所以答案就是 $ ...
- reGeorg(不需要外网ip的代理)
reGeorg _____ ______ __|___ |__ ______ _____ _____ ______ | | | ___|| ___| || ___|/ \| | | ___| | \ ...
- vue后台_实战篇
一.一些常用组件效果的实现 1)面包屑导航 主要是使用$route.mathed:一个数组,包含当前路由的所有嵌套路径片段的路由记录 .路由记录就是 routes 配置数组中的对象副本 (还有在 ch ...
- abd shell pm list packages
abd shell pm list packages ####查看当前连接设备或者虚拟机的所有包 adb shell pm list packages -d #####只输出禁用的包. adb she ...
- spring cloud gateway:Unable to find GatewayFilterFactory with name Hystrix
在springcloud gateway中引用Hystrix filter 编译启动时提示 Unable to find GatewayFilterFactory with name Hystrix ...
- mysql —备份和恢复
备份的目的 灾难恢复.硬件故障.软件故障.自然灾害.黑客攻击.误操作测试等数据 丢失场景 备份注意要点 能容忍最多丢失多少数据 恢复数据需要在多长时间内完成 需要恢复哪些数据 还原要点 做还原测试,用 ...
- 第11组 Beta冲刺(3/5)
第11组 Beta冲刺(3/5) 队名 不知道叫什么团队 组长博客 https://www.cnblogs.com/xxylac/p/12006665.html 作业博客 https://edu. ...
- mysql中的union操作(整理)
mysql中的union操作(整理) 一.总结 一句话总结: union两侧的字段数和字段类型要是一样的 union可以接多个 orderby和排序可以在最后的union组合之后 1.union简单实 ...
- ArcGIS超级工具SPTOOLS-影像的批量裁剪和批量合并
1.1 影像批量裁剪 操作视频: https://weibo.com/tv/v/Hw25XqOL4?fid=1034:4376345233306897 影像批量裁剪:一个影像(可以多波段,也可以单波 ...