对于迪杰斯特拉算法的学习
7-1 单源最短路径
本题目要求一有向有权图(以边列表的形式读入),一个起点和一个终点。输出源点到终点的最短路径。
输入格式:
输入三个整数n(100000<n<10000000),s和d,其中n表示边数目,s为起点,d为终点。然后依次输入n条边:v1 v2 w(v1为出度端点,v2为入度端点,w为权值,三者均为非负整数,其中w不超过20,v1和v2不超过1000000且节点序号不一定连续)
输出格式:
一个整数,表示s到d的最短距离。如果不可达,则输出-1.
输入样例:
在这里给出一组输入。例如:
11 0 8
0 1 6
0 2 4
0 3 5
1 4 1
2 4 1
3 5 2
4 6 9
4 7 7
5 7 4
6 8 2
7 8 4
输出样例:
在这里给出相应的输出。例如:
15
因为实验隐藏的测试用例很大,故采用邻接表结构存储边权图;
为了解决内存超限问题,故将数据保存在堆中,即通过new创建数组
为了解决超时问题,故采用了优先队列
段错误可能原因:终点给小了,用例中可能有超过了终点的大小的节点出现
解决办法:直接开一个MAX大小的数组(MAX=1000000),省略不需要的节点信息,例如Path
#include<iostream>
#include<algorithm>
#include<queue>#define MAX 1000000
#define MAXInt 31245
using namespace std;
typedef pair<int,int> Pair;//用优先队列选取权重最小的节点
int arc,s,e;
priority_queue<Pair,vector<Pair>,greater<Pair> >que;typedef struct ArcNode{int adjvex;int weight;struct ArcNode* nextarc;
}ArcNode;
typedef struct VNode{
// int data;//数组下标即节点名称,不需要data信息bool vis;int wei;
// int path;//用pair存的值<weight,该权重的节点> ,不需要路径,故path不需要 ArcNode *firstarc;
}VNode;
typedef struct{VNode* vertice;int vexnum,arcnum;
}ALGraph;void Creat(ALGraph &G);
void Dij(ALGraph &G,int s);
int main(){ALGraph G;Creat(G);#if 0 //此处为测试段,测试是否成功创建邻接表for(int i=0;i<MAX;i++){ArcNode* p=G.vertice[i].firstarc;while(p!=NULL){//!p是不正确的 cout<<p->adjvex<<" ";p=p->nextarc;}cout<<endl;}#endif
/*以下为控制结果的输出,若未找到,输出-1*/Dij(G,s);if(G.vertice[e].wei!=MAXInt)cout<<G.vertice[e].wei<<endl;elsecout<<-1<<endl;delete []G.vertice;
}
void Creat(ALGraph &G){cin>>arc>>s>>e;//输入边数,起点,终点 G.vertice=new VNode[MAX];G.arcnum=arc;//G.vexnum=e+1;for(int k=0;k<MAX;k++){G.vertice[k].firstarc=NULL;// G.vertice[k].data=k;G.vertice[k].vis=false;G.vertice[k].wei=MAXInt;// G.vertice[k].path=-1;}for(int i=0;i<G.arcnum;i++){int v1,v2,wei;cin>>v1>>v2>>wei;ArcNode *pe=new ArcNode;pe->adjvex=v2;pe->weight=wei;pe->nextarc=G.vertice[v1].firstarc;G.vertice[v1].firstarc=pe; }
}
void Dij(ALGraph &G,int s){G.vertice[s].wei=0;//初始化起点weight为0/*错误点1:初始化只需将起点初始化插入队列即可,不需要对起点的邻接点也初始化,
此处操作与循环中操作相同*//*ArcNode *p=G.vertice[s].firstarc;while(p!=NULL){G.vertice[p->adjvex].wei=p->weight;//初始化权重 G.vertice[p->adjvex].path=s;//初始化前驱节点 // ArcNode *d=p;p=p->nextarc;// delete d;//释放d所指向的内存 } */que.push(Pair(0,s));while(!que.empty()){Pair tmp=que.top();que.pop();int v=tmp.second;//节点 int w=tmp.first;//权重 if(G.vertice[v].vis==true)continue;elseG.vertice[v].vis=true;//s已被访问 ArcNode *p=G.vertice[v].firstarc;while(p!=NULL){int v0=p->adjvex;if(w+p->weight<G.vertice[v0].wei&&!G.vertice[v0].vis){G.vertice[v0].wei=G.vertice[v].wei+p->weight;//G.vertice[v0].path=v;//更新前驱节点 que.push(Pair(G.vertice[v0].wei,v0));}p=p->nextarc;//错误点2:p未循环 } }
}
对于上述代码的优化:
1.可以在找到终点时就退出循环,输出结果
2.对于此处的优先队列来说,我以pair(相当于下图的map)为关键字存储,故会存在同一个节点对应不同weight的情况,例如:之前存入了<3,1> (节点1的weight为3),更新之后存入了<2,1>(节点1的权重为2),虽不影响结果,但队列里会有重复的节点,浪费内存
改进:入队前与已在队列里的节点比较weight,小于则修改weight
3、采用链式前向星+优先队列
https://pursuit.blog.csdn.net/article/details/107674290
反思与总结
通过这次实验,让我意识到,从代码思想到代码实现,再到具体的实际应用,这之间都是有距离的。
代码思想到实现:这考验的是个人代码实现水平,把思想变成代码的能力有待加强
代码思想到实际应用:实际应用过程中,由于数据量,时间限制等多方面因素的影响,这就需要改善代码的适应性,结合一些其他的手段以投入实际应用。算法不可能是赤裸裸的直接用的。对于实际问题的处理能力有待增强。
对于迪杰斯特拉算法的学习相关推荐
- java迪杰斯特拉算法介绍_178-迪杰斯特拉(Dijkstra)算法基本介绍
2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...
- python做算法分析_Python实现迪杰斯特拉算法过程解析
一. 迪杰斯特拉算法思想 dijkstra算法主要针对的是有向图的单元最短路径问题,且不能出现权值为负的情况!dijkstra算法类似于贪心算法,其应用根本在于最短路径的最优子结构性质. 最短路径的最 ...
- c++ 遍历所有点且距离最短_图解:最短路径之迪杰斯特拉算法
小禹禹们,你们好,景禹最近已经开学,忙着准备毕业答辩的事情,这才抽身个大家更新文章,还请莫怪.生活实属不易,有时候让人有点儿焦头烂额,甚至想让景禹放弃继续更新文章,可是千百号人默默地关注者景禹,当然也 ...
- 最短路径问题(图表详解迪杰斯特拉算法)
首先,我们来看一下相关的图的一些基本知识点: 图:图 G=(V,E) 由顶点集 V 和边集 E 组成.每条边对应一个点对 (v,w),其中 v,w 属于 V .如果图中的点对是有序的,那么该图就是有向 ...
- 校园导游系统_C语言实现_Dijkstra(迪杰斯特拉算法)_数据结构
西京学院导游系统 摘要 要完成对整个导游图系统的功能实现,需要对每一项功能都有清楚的设想和认识,了解并明确每一项功能的实现和需要解决的问题,选择正确并且高效的算法把问题逐个解决,最终实现程序的正确 ...
- 数据结构课设之校园导航系统(迪杰斯特拉算法)
一.需求分析 介绍学校的主要地点和这些地点的特点,以及从一个地点到达另外一个地点的最短路径. 二.系统设计 1.理论依据 根据设计要求分析校园导航系统的设计要求,掌握设计中所设计到的无向网的建立,遍历 ...
- 图的应用---最短路径问题 用迪杰斯特拉算法解决 《地铁换乘问题》
图的应用-最短路径问题 用迪杰斯特拉算法解决 <地铁换乘问题> 代码是在我学习的过程中完成的,也许会有问题,希望大家批评指正. 题目: 描述:已知2条地铁线路,其中A为环线,B为东西向线路 ...
- 迪杰斯特拉算法-西安地铁最短路线问题
文章说明 图是一种较线性表和树更为复杂的数据结构,在各个领域都有着广泛的应用,如城市交通.电路网络分析.交通灯的设置等,其中,最短路径问题的求解是日常生活中最为常见的问题.在现实生活和生产实践中,有许 ...
- 图 相关算法~从头学算法【广搜、 深搜、 拓扑排序、 并查集、 弗洛伊德算法、迪杰斯特拉算法】
图的相关主流算法主要有: 广度优先搜索 深度优先搜索 拓扑排序 并查集 多源最短路径(弗洛伊德算法) 单源最短路径(迪杰斯特拉算法) 其中呢,最基本的是前两种,也就是平时常用的广搜和深搜,本文中将概要 ...
最新文章
- golang微服务框架对比_微服务里程碑,Golang与Spring Cloud Alibaba完美结合
- 一个简单程序的反编译
- VC++程序开机自启动(注册表上注册)
- TF之NN:利用DNN算法(SGD+softmax+cross_entropy)对mnist手写数字图片识别训练集(TF自带函数下载)实现87.4%识别
- centos安装jdk7
- SpringBoot2.0 以上 WebMvcConfigurerAdapter 方法过时 解决办法
- 请领导审阅并提意见应怎么说_职场中,领导不喜欢你,暗中排挤你,怎么办?老员工给你支5招!...
- 计算机及相关设备制造业2020,在现实生活中,接近完全垄断市场类型的行业包括()。A.计算机及相关设备制造业B.稀有...
- django-正向查询与反向查询演练-查询集的三种状态
- Windows 8正式版亮点与新功能抢先看
- python retry retrying使用
- Dynamics AX2012 Menu Items Type
- 在软件测试中UT,IT,ST,UAT分别是什么意思
- arcgis超级工具安装教程_ArcGIS超级工具SPTOOLS1.7升级说明
- Power BI----各类切片器的使用
- Java真的是低糖语言吗?
- 李开复--生命是最严厉的导师
- 你做过哪些事情让你女朋友感动到哭,这个100%可以做到!
- 无人驾驶算法学习(十一):IMU标定及Allan方差分析
- 笔记本处理器排名_Intel十代处理器笔记本电脑排行榜 (附带推荐机型信息20191021)...