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. C语言学习笔记6-数组

    本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/50752170 作者:jadeshu   邮箱: jades ...

  2. c++ 容器反转

    // reverse algorithm example #include <iostream> // std::cout #include <algorithm> // st ...

  3. Python学习日记(六)——内置函数和文件操作(lambda)

    lambda表达式 学习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即: # 普通条件语句 if 1 == 1: name = 'prime' else: name = 'c ...

  4. white-space 标签 使用

    white-space MSD定义为: 是用来设置如何处理元素中的空白 其使用场景有很多,比如:横向滑动,超出显示省略号,输出空格显示空格等 1.横向滑动 在写手机页面的过程中,我想大部分人都遇到横向 ...

  5. Linux设备驱动程序 之 内核定时器

    综述 如果需要在将来的某个时间点调度执行某个动作,同时在该时间点到达之前不会阻塞当前进程,则可以使用内核定时器: 内核定时器是一个数据结构,它告诉内核在用户定义的时间点使用用户定义的参数来执行一个用户 ...

  6. vue devtools无法使用

    vue devtools无法使用 一.总结 一句话总结: 没显示vue devtools调试工具的原因是用了生产环境的版本或是压缩的vue版本,或是没有勾选:允许访问文件网址 二.vue调试工具Dev ...

  7. win10 下cuda 9.0 卸载

    1.首先 对于cuda8.0.cuda7.5的卸载都可以兼容 安装cuda9.0之后,电脑原来的NVIDIA图形驱动会被更新,NVIDIA Physx系统软件也会被更新(安装低版cuda可能不会被更新 ...

  8. jmeter-移动端接口测试中遇到的问题,http与https

    解决:将请求默认值的http改成https

  9. SQL-W3School-高级:SQL UNION 和 UNION ALL 操作符

    ylbtech-SQL-W3School-高级:SQL UNION 和 UNION ALL 操作符 1.返回顶部 1. SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT ...

  10. SQLW3School-高级:SQL TOP 子句

    ylbtech-SQLW3School-高级:SQL TOP 子句 1.返回顶部 1. TOP 子句 TOP 子句用于规定要返回的记录的数目. 对于拥有数千条记录的大型表来说,TOP 子句是非常有用的 ...