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. LR性能测试课程及视频教程

    LR性能测试课程及视频教程课程如下: 1.性能测试核心技术-2.性能测试脚本开发-3.LR场景设计-4.LR指标分析. 1.性能测试是通过自动化的测试工具模拟多种正常.峰值以及异常负载条件来对系统的各 ...

  2. JVM备忘点(1.8以前)

    1.内存结构 左边两个线程共享,右边三个线程私有. 方法区:.class文件的类信息.常量.static变量.即时编译器编译后的代码(动态代理).HotSpot将方法区称为永久代 堆:分为新生代和老年 ...

  3. leveldb源码分析之内存池Arena

    转自:http://luodw.cc/2015/10/15/leveldb-04/ 这篇博客主要讲解下leveldb内存池,内存池很多地方都有用到,像linux内核也有个内存池.内存池的存在主要就是减 ...

  4. ArcGIS Server“无法创建站点,计算机不具有有效的的许可”

    问题描述 ArcGIS Server10.5安装过程中,所有授权和破解均已完成,但是最后一步创建站点的时候显示创建失败,会出现如下图所示的问题:既“无法创建站点,计算机不具有有效的的许可…”,经历了卸 ...

  5. pwn学习日记Day9 基础知识积累

    知识杂项 libc是Linux下的ANSI C的函数库. LOOKUP函数 数组形式:公式为= LOOKUP(lookup_value,array) 式中 array-包含文本.数字或逻辑值的单元格区 ...

  6. 如何查看linux内核中驱动的初始化顺序?

    答:通过生成的System.map可以查看到,主要关注__initcall_<module_entry_function>_init<level>,如: __initcall_ ...

  7. JDBC的异常处理方式

    A: try...catch(...) {...} finally {} B: 关闭ResultSet,Statement , Connection import java.sql.Connectio ...

  8. smarty获得当前url的方法分享

    http://{$smarty.server.SERVER_NAME}/{$smarty.server.REQUEST_URI} 注释: 复制代码代码如下: {$smarty.server.SERVE ...

  9. Session_start的使用

    PHP session用法其实很简单它可以把用户提交的数据以全局变量形式保存在一个session中并且会生成一个唯一的session_id,这样就是为了多了不会产生混乱了,并且session中同一浏览 ...

  10. git撤销某次提交

    1.查询提交记录.进入目录,查看某人在此目录下的commit: panxi@ww-bj-panxi MINGW64 [path]/Business (feature/v2.3) $ git log f ...