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算法——超~~详细!!的更多相关文章

  1. 【优化算法】Greedy Randomized Adaptive Search算法 超详细解析,附代码实现TSP问题求解

    01 概述 Greedy Randomized Adaptive Search,贪婪随机自适应搜索(GRAS),是组合优化问题中的多起点元启发式算法,在算法的每次迭代中,主要由两个阶段组成:构造(co ...

  2. 数据挖掘领域十大经典算法之—C4.5算法(超详细附代码)

    https://blog.csdn.net/fuqiuai/article/details/79456971 相关文章: 数据挖掘领域十大经典算法之—K-Means算法(超详细附代码)        ...

  3. Dijkstra算法详细(单源最短路径算法)

    介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...

  4. 求两点之间最短路径-Dijkstra算法

     Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...

  5. 超强、超详细Redis数据库入门教程

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...

  6. 最短路径—Dijkstra算法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...

  7. Til the Cows Come Home(poj 2387 Dijkstra算法(单源最短路径))

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32824   Accepted: 11098 Description Bes ...

  8. Dijkstra算法(迪杰斯塔拉算法)

    算法描述: Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最 ...

  9. 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径

    自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...

随机推荐

  1. kubernets安装rabbitmq集群.

    RabbitMQ集群的两种模式 1)普通模式:默认的集群模式,队列消息只存在单个节点上 2)镜像模式:队列为镜像队列,队列消息存在每个节点上 配置同步: 配置同步: 1.Ha mode 同步模式,以下 ...

  2. Python互联网金融之用户增长的数据逻辑

    怎样看待和应用我们互联网金融中的数据? 怎样进行数据分析? 互联网金融数据分析的三个层面: (1)指标层面 建立指标体系,观察指标涨跌的情况 (2)行业框架 不同的行业对于各个指标的权重不同 复投率 ...

  3. java试题复盘——11月13日

    上: 10. AccessViolationException异常触发后,下列程序的输出结果为(   A   ) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 AccessViol ...

  4. CF1214A

    CF1214A 题意: 有n个卢布,要换成美元和欧元,使手上剩余的卢布最少.一美元价值d卢布,一欧元价值e卢布. 解法: 可以看成只有两个没有代价的可以无限取的物品的完全背包. CODE: #incl ...

  5. Flutter安装

    下载右边的安装包以获取最新版本 stable 的 Flutter SDK 将压缩包解压,然后把其中的 flutter 目录整个放在你预想的 Flutter SDK 安装目录中(比如 C:\src\fl ...

  6. Mac OS 下三种修改Hosts文件的方法

    一.系统偏好设置修改 1.打开系统偏好设置,底部有一个Hosts的快捷入口2.输入ip和hostname后,回车确定,勾选改host即可   二.终端命令行修改 sudo vi /etc/hosts ...

  7. RGB-D(深度图像) & 图像深度

    RGB-D(深度图像)   深度图像 = 普通的RGB三通道彩色图像 + Depth Map   在3D计算机图形中,Depth Map(深度图)是包含与视点的场景对象的表面的距离有关的信息的图像或图 ...

  8. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_09-webpack研究-webpack介绍

    使用vue.js开发大型应用需要使用webpack打包工具,本节研究webpack的使用方法. 1.3.1 webpack介绍 Webpack 是一个前端资源的打包工具,它可以将js.image.cs ...

  9. HDFS数据定期清理

    HDFS数据清理一些办法: datanode数据做reblance清理临时目录.日志目录文件全量分区表历史分区清理使用lzo,orc格式进行数据压缩清理或者归档历史冷数据增加datanode横向扩容附 ...

  10. 读写Session

    读写Session Session是保存在服务端的字典 Session与Cookie有些类似,都是通过字典管理key-value对,只不过Cookie是保存在客户端的字典,而Session是保存在服务 ...